我想通过添加带有一些单选按钮和其他小部件的表单来对搜索结果添加更多过滤器。该文档指出new Date()
不会保持状态,应调用父级的Radio
setState
方法来重建小部件。调用onChange
后将显示该表单。
看着showModalBottomSheet
似乎只有在查询更改后才在内部调用setState
我做了什么
假设没有search.dart
这样的方法,我重新显示对话,依次呼叫setState
和Navigation.pop(context)
。现在,单选按钮可以更新onChanged的值,但是重新分布对话框的过渡看起来很丑(每次更改值时都会滑动动画)。
是否可以在searchDelegate中使用setState?如何使用?
答案 0 :(得分:5)
@George已经提供了解决方案,但这是使用SearchDelegate时的完整示例:
class DataSearch extends SearchDelegate<String> {
bool _isItemSelected = true;
//...rest of the @override methods
@override
Widget buildSuggestions(BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return CheckboxListTile(
title: const Text('Item'),
value: _isItemSelected,
onChanged: (bool newValue) {
setState(() {
_isItemSelected = newValue;
});
},
);
});
}
}
答案 1 :(得分:1)
您需要使用的是StatefulBuilder
,由showModalBottomSheet
的构建者返回。
StatefulBuilder
提供了setState
方法来重建自己的子树。
例如
int selected;
showModalBottomSheet(context: context, builder: (_) =>
StatefulBuilder(builder: (modalContext, modalSetState) =>
Column(children: <Widget>[
Text("Select radio button"),
RadioListTile(
value: 1,
groupValue: selected,
onChanged: (val) => modalSetState(() => selected = val),
title: Text("One")
),
RadioListTile(
value: 2,
groupValue: selected,
onChanged: (val) => modalSetState(() => selected = val),
title: Text("Two")
),
])
)
).whenComplete(() {
print("Selected: $selected");
});
在我的示例中,模态内容的setState
被声明为modalSetState
构建器参数。