首页 > 解决方案 > 如何在 showModalBottomSheet 中设置状态

问题描述

在 BottomSheet 中是否存在我们无法更新小部件状态的限制?正如您在下面的示例中看到的那样,我正在使用 Switch,但它的显示没有改变,尽管值更新了,只是它不会再次重新渲染。

这是 StatefulWidget 现在的一部分。

我在使用 DropdownButton 小部件时遇到了同样的问题。这些都可以在正常页面中正常工作。

有人有这个想法吗?

showModalBottomSheet(
  context: context,
  builder: (BuildContext context) {
    return BottomSheet(
      onClosing: () {},
      builder: (BuildContext context) {
        return Switch(
          onChanged: (bool v) {
            debugPrint('v is ${v.toString()}');
            // b = v; <<-- This is also not working when using StatelessWidget
            setState(() => b = v);
            debugPrint(b.toString());
          },
          value: b,
        );
      },
    );
  },
);

标签: flutterdart

解决方案


这里的问题是BottomSheet您正在创建的不是您的StatefulWidget. 如果您只是为了使用setStateinside of而使您的小部件有状态showModalBottomSheet,您现在可以恢复该更改。

你真正想做的是在你的BottomSheet. 您可以通过将 a 传递StatefulWidget给 thebuilder或使用 aStatefulBuilder来做到这一点,为了简单起见,我将在此示例中这样做:

showModalBottomSheet(
  context: context,
  builder: (BuildContext context) {
    return BottomSheet(
      onClosing: () {},
      builder: (BuildContext context) {
        bool b = false;
        return StatefulBuilder(
          builder: (BuildContext context, setState) => Switch(
            onChanged: (bool v) {
              setState(() => b = v);
            },
            value: b,
          ),
        );
      },
    );
  },
);

我 还在. b_builderBottomSheet

如果您还想使用b原始文件 inside的值,StatefulWidget则可以再次将其移出,并且您可能还想调用this.setState以更新其他小部件(仅当您需要更新时)。


推荐阅读