【发布时间】:2022-01-16 13:02:21
【问题描述】:
所以我有以下代码来显示ModalBottomSheet,并在页面上显示过滤器/复选框。如果我退出模式并再次显示 showModalBottomSheet,那么我看不到复选框值得到保留。
似乎我第二次显示模态时,再次调用了 _CheckboxStatefulWidgetState 的 build(),然后将 checkValue 默认为 null。
这里是filter.dart
import 'package:flutter/material.dart';
import '../helper/checkbox.dart';
mixin ListFilter<T extends StatefulWidget> on State<T> {
dynamic filters = [
{
"name": "name1",
"choices": [
{'label': 'label1', 'value': 'value1', 'check': false},
{'label': 'label2', 'value': 'value2', 'check': false},
],
},
{
"name": "nameA",
"choices": [
{'label': 'labelA', 'value': 'valueA', 'check': false},
{'label': 'labelB', 'value': 'valueB', 'check': false},
],
},
];
dynamic filterWidgets;
void showFilterModal(context, dynamic filters) {
showModalBottomSheet<void>(
context: context,
//isScrollControlled: true,
builder: (BuildContext context) {
if (filterWidgets == null) {
print("----> filterWidgets is null");
filterWidgets = _getFilterWidgets(filters);
}
return Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: filterWidgets),
),
);
},
);
}
List<Widget> _getFilterWidgets(dynamic filters) {
List<Widget> children = [];
for (var i = 0; i < filters.length; i++) {
dynamic filter = filters[i];
dynamic choices = filter['choices'];
for (var j = 0; j < choices.length; j++) {
dynamic choice = choices[i];
children.add(CheckboxStatefulWidget(
label: choice['label']));
}
Widget divider = Divider();
children.add(divider);
}
return children;
}
}
这里是checkbox.dart
import 'package:flutter/material.dart';
class CheckboxStatefulWidget extends StatefulWidget {
final String label;
CheckboxStatefulWidget({Key key, this.label}) : super(key: key);
@override
_CheckboxStatefulWidgetState createState() =>
_CheckboxStatefulWidgetState();
}
class _CheckboxStatefulWidgetState extends State<CheckboxStatefulWidget> {
bool checkValue;
@override
Widget build(BuildContext context) {
print("checkValue: $checkValue");
print(checkValue == true ?? false);
return CheckboxListTile(
title: Text(this.widget.label),
value: checkValue == true ?? false,
onChanged: (bool newValue) {
setState(() {
checkValue = newValue;
});
});
}
}
【问题讨论】: