【发布时间】:2021-05-19 10:56:57
【问题描述】:
我有一个StatefulWidget,其中包含一个ListView() 和一个ListView.builder()。 ListView.builder() 使用两个列表构建多个 CheckboxListTile(),一个用于标签,一个用于布尔值。但是它没有按预期工作。我试图创建一个问题的最小示例,它看起来像这样:
import 'package:flutter/material.dart';
class TestClass extends StatefulWidget {
@override
_TestClassState createState() => _TestClassState();
}
class _TestClassState extends State<TestClass> {
@override
Widget build(BuildContext context) {
bool firstBoolean = false;
bool secondBoolean = false;
List labels = [
"First Checkbox",
"Second Checkbox",
];
List<bool> booleans = [
firstBoolean,
secondBoolean,
];
return ListView(
children: [
Container(
height: MediaQuery.of(context).size.height * 0.5,
child: ListView.builder(
physics: AlwaysScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: 2,
itemBuilder: (context, index) {
return CheckboxListTile(
title: Text("${labels[index]}"),
value: booleans[index],
onChanged: (bool newValue) {
setState(() {
secondBoolean = newValue;
print(
"firstBoolean, secondBoolean: [$firstBoolean, $secondBoolean]");
});
},
);
}),
),
],
);
}
}
这不会更改复选框,也不会更改分配的布尔值。如果我替换这一行:
value: booleans[index]
与
value: firstBoolean
并将bool firstBoolean = false; 移动到_TestCassState 中的@override 上方它“有效”,但由于所有复选框现在都分配了相同的布尔变量,因此它会同时更改所有复选框。但我不明白为什么这“有效”而上面的代码没有。此外,如果我尝试在@override 上方创建我需要的所有布尔值,然后尝试创建一个包含所有这些布尔值的列表,我会收到此错误:
实例成员“firstBoolean”无法在 初始化器。尝试将实例成员的引用替换为 不同的表达方式
如果我使用@override 上方的标签移动到列表,它不会给我这个错误并正确分配标签
我觉得我不了解 StatefulWidgets 的一些基本知识。所以如果有人能给我解释如何正确解决这个问题以及为什么这不能按预期工作,我真的很感激
【问题讨论】:
标签: flutter dart statefulwidget