flutter - 如何在 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,
);
},
);
},
);
解决方案
这里的问题是BottomSheet
您正在创建的不是您的StatefulWidget
. 如果您只是为了使用setState
inside 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
_builder
BottomSheet
如果您还想使用b
原始文件 inside的值,StatefulWidget
则可以再次将其移出,并且您可能还想调用this.setState
以更新其他小部件(仅当您需要更新时)。
推荐阅读
- javafx - 多个 Text 对象(在 JavaFX 中)可以同时设置它们的样式吗?
- macos - 无法使用终端将文件夹复制到特定位置 - Mac
- mysql - 如何将 R 连接到 MySQL?无法连接到数据库:错误:无法加载插件缓存_sha2_password
- c++ - 如何知道在这种情况下要编译什么?
- c# - 查询 System.Xml.Linq.XElement 中的元素
- python - 如何使用配置文件更改 Flask 服务器主机/端口?
- laravel - 存储在 laravel 上的奇怪问题
- ibm-doors - 传递给跳过列表的空参数
- c# - c# error cannot convert collection.generic.lists to classes
- r - 如何根据滑块输入选择过滤闪亮的日期(年份)?