【发布时间】:2019-07-13 12:32:00
【问题描述】:
对不起,如果这不是很清楚。我欢迎任何澄清的建议,因为我是 Flutter 的新手,也想在 StackOverflow 上提问。
我将发布有效和无效的内容。基本上我想要一个 Perk 小部件,其中包含不同数量的 Checkbox 小部件。当我在 build 方法中创建小部件时,我可以设置它们的状态(选中或未选中),但使用列表中的 for 循环动态创建 Checkbox 小部件并将该列表传递给 Row 会使复选框无响应。
不起作用(但我不知道为什么,这就是我想要的)
import 'package:flutter/material.dart';
import 'package:gloomhaven_enhancement_calc/data/constants.dart';
class Perk extends StatefulWidget {
final int numOfChecks;
final String details;
final List<String> icons;
Perk(this.numOfChecks, this.details, this.icons);
@override
State<StatefulWidget> createState() => PerkState();
}
class PerkState extends State<Perk> {
int _numOfChecks;
String _details;
List<String> _icons;
bool _isChecked = false;
List<Checkbox> checkList = [];
@override
void initState() {
super.initState();
_numOfChecks = widget.numOfChecks;
_details = widget.details;
_icons = widget.icons;
setState(() {
void _itemChange(bool val) {
// setState(() {
_isChecked = val;
// });
print('clliccked' + val.toString());
}
for (int x = 0; x < _numOfChecks; x++) {
checkList.add(Checkbox(
value: _isChecked,
onChanged: (bool value) => _itemChange(value),
),);
}
});
}
Widget build(BuildContext context) {
return Container(
color: Colors.grey.withOpacity(0.75),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
// here I pass the list of checkboxes created above, but they
// don't respond to user clicks
Row(children: checkList),
Expanded(
child: Text(
_details,
style: TextStyle(fontFamily: secondaryFontFamily),
),
),
],
));
}
}
工作(但我必须硬编码复选框的数量 - 我需要能够根据 numOfChecks 参数动态创建它们)
import 'package:flutter/material.dart';
import 'package:gloomhaven_enhancement_calc/data/constants.dart';
class Perk extends StatefulWidget {
final int numOfChecks;
final String details;
final List<String> icons;
Perk(this.numOfChecks, this.details, this.icons);
@override
State<StatefulWidget> createState() => PerkState();
}
class PerkState extends State<Perk> {
int _numOfChecks;
String _details;
List<String> _icons;
bool _isChecked = false;
List<Checkbox> checkList = [];
@override
void initState() {
super.initState();
_numOfChecks = widget.numOfChecks;
_details = widget.details;
_icons = widget.icons;
}
void checkboxChecked(bool val) {
// setState(() {
_isChecked = val;
// });
print('clliccked' + val.toString());
}
Widget build(BuildContext context) {
return Container(
color: Colors.grey.withOpacity(0.75),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Row(children:
<Widget>[
// here I create checkboxes based on the number but it's
// obviously a hack just to make it work
Checkbox(
value: _isChecked,
onChanged: (bool value) => checkboxChecked(value),
),
_numOfChecks > 1 ? Checkbox(
value: _isChecked,
onChanged: (bool value) => checkboxChecked(value),
) : Container(),
_numOfChecks > 2 ? Checkbox(
value: _isChecked,
onChanged: (bool value) => checkboxChecked(value),
) : Container(),
_numOfChecks > 3 ? Checkbox(
value: _isChecked,
onChanged: (bool value) => checkboxChecked(value),
) : Container(),
_numOfChecks > 4 ? Checkbox(
value: _isChecked,
onChanged: (bool value) => checkboxChecked(value),
) : Container(),
]
),
Expanded(
child: Text(
_details,
style: TextStyle(fontFamily: secondaryFontFamily),
),
),
],
));
}
}
奖金
我还需要将每个复选框状态保存在 sharepreferences 中。我打算为每个条目创建一个单独的条目,但我确信有一种更有效的方法。他们不需要做任何事情,只需要记住它们是否被选中或取消选中,并在重新启动时保持不变。
【问题讨论】: