如何在SearchDelegate中使用setState

时间:2019-05-27 07:20:56

标签: flutter

我想通过添加带有一些单选按钮和其他小部件的表单来对搜索结果添加更多过滤器。该文档指出new Date()不会保持状态,应调用父级的Radio setState方法来重建小部件。调用onChange后将显示该表单。 看着showModalBottomSheet似乎只有在查询更改后才在内部调用setState

我做了什么 假设没有search.dart这样的方法,我重新显示对话,依次呼叫setStateNavigation.pop(context)。现在,单选按钮可以更新onChanged的值,但是重新分布对话框的过渡看起来很丑(每次更改值时都会滑动动画)。

是否可以在searchDelegate中使用setState?如何使用?

2 个答案:

答案 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构建器参数。