在Flutter中使用SetState无效?可能是忽略了这个!
这次是Flutter开发技术分享,解决的问题点来自本人实际的开发经历。
首先描述一下问题:在某个组件中调用setState()方法更新该组件状态,结果是无法做到更新效果,组件仍然维持原状。
下面我们用代码示例还原问题场景:
class _MyHomePageState extends State<MyHomePage> {
bool isChecked = false;
showTestDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return SimpleDialog(title: Text("测试对话框标题"), children: <Widget>[
Row(children: <Widget>[
Checkbox(
value: this.isChecked,
onChanged: (bool val) {
setState(() {
this.isChecked = !this.isChecked;
});
debugPrint(this.isChecked.toString());
}),
Text("测试复选框")
])
]);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: RaisedButton(
child: Text("点击出现弹窗"),
onPressed: () {
showTestDialog();
},
)),
);
}
}
为了突出问题点,减少不必要的干扰,我简化了原有代码内容。通过阅读上述代码,我们得知整个Demo的界面有一个按钮构成,当按钮被点击时,showTestDialog()方法被执行。界面将显示一个小窗口,里面有一个复选框。
我们要实现的效果当然是用户点击复选框的时候,改变复选框的状态。因此,在复选框的onChanged()方法中改变了决定复选框状态的布尔值,并setState()。
然而真实的运行结果并非像预期那样产生效果。
究其原因,我们还需从setState()说起。
顾名思义,setState()要求其作用对象必须是一个有状态的组件。如果作用对象本身无状态,那么setState()将无法起作用。
因此,我们找到原因:SimpleDialog()中的子组件默认是无状态的。
接下来的解决办法就简单了,只需要在SimpleDialog组件外部“套”一个StatefulBuilder组件即可。参考下面的代码:
class _MyHomePageState extends State<MyHomePage> {
bool isChecked = false;
showTestDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder:
(BuildContext context, void Function(void Function()) setState) {
return SimpleDialog(title: Text("测试对话框标题"), children: <Widget>[
Row(children: <Widget>[
Checkbox(
value: this.isChecked,
onChanged: (bool val) {
setState(() {
this.isChecked = !this.isChecked;
});
debugPrint(this.isChecked.toString());
}),
Text("测试复选框")
])
]);
},
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: RaisedButton(
child: Text("点击出现弹窗"),
onPressed: () {
showTestDialog();
},
)),
);
}
}
再次运行,对话框中的复选框可以正常响应。至此,问题解决。
在Flutter中使用SetState无效?可能是忽略了这个!的更多相关文章
- Flutter 中那么多组件,难道要都学一遍?
在 Flutter 中一切皆是 组件,仅仅 Widget 的子类和间接子类就有 350 多个,整理的 Flutter组件继承关系图 可以帮助大家更好的理解学习 Flutter,回归正题,如此多的组件到 ...
- 在Flutter中嵌入Native组件的正确姿势是...
引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...
- mvp 在 flutter 中的应用
在 Android 应用程序开发过程中,我们经常会用到一些所谓的架构方法,如:mvp,mvvm,clean等.之所以这些方法会被推崇是因为他们可以大大的解耦我们的代码的功能模块,让我们的代码在项目中后 ...
- 理解 Flutter 中的 Key
概览 在 Flutter 中,大概大家都知道如何更新界面视图: 通过修改 Stata 去触发 Widget 重建,触发和更新的操作是 Flutter 框架做的. 但是有时即使修改了 State,Flu ...
- Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker
今天我们来聊聊Flutter中的日期和日期选择器. Flutter中的日期和时间戳 //日期时间戳转换 var _nowTime = DateTime.now();//获取当前时间 print(_no ...
- Flutter中的浮动按钮FloatingActionButton 及融合底部工具栏
FloatingActionButton 简称 FAB,从字面理解可以看出,它是“可交互的浮动按钮”,其实在Flutter默认生成的代码中就有这家伙,只是我们没有正式的接触. 一般来说,它是一个圆形, ...
- flutter中的生命周期函数
前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,flutter中的State生命周期和android以及React Native的生命周期类似. 先看一张 ...
- Flutter中的日期、格式化日期、日期选择器组件
Flutter中的日期和时间戳 //獲取當前日期 DateTime _nowDate = DateTime.now(); print(_nowDate);//2019-10-29 10:57:20.3 ...
- Flutter 中的表单
一.Flutter 常用表单介绍 Flutter 中常见的表单有 TextField 单行文本框,TextField 多行文本框.CheckBox.Radio.Switch CheckboxLi ...
- Flutter中的绘图(Canvas&CustomPaint)API
本文是Flutter中Canvas和CustomPaint API的使用实例. 首先看一下我们要实现的效果: 结合动图演示,列出最终目标如下: 在程序运行后,显示一个小球: 每次程序启动后,小球的样式 ...
随机推荐
- C语言【进制、原反补码、数据类型】
C语言[进制.原反补码.数据类型] 1.二进制.八进制.十进制.十六进制在C语言中的使用(赋值及输出)? /** 二进制 赋值时以 0b 或 0B 开头: 输出时没有所属占位符, 十六进制整数输出也比 ...
- CPF C#跨平台UI框架开源了
介绍 C#跨平台UI框架 提供NETStandard2.0和net4的库,通过Netcore可以跨平台,支持Windows.Mac.Linux,Net4的可以支持XP. 各个平台运行效果一致,不依赖系 ...
- 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇
首先,让我来介绍一下今天的主题.今天我们将讨论封装.反射以及单例模式.除此之外,我们不再深入其他内容.关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符.而对于反 ...
- 数据可视化工具 ,不会写 SQL 代码也能做数据分析
数据可视化工具可以帮助人们以直观.易于理解的方式展现和分析数据.这些工具使得即使不会写 SQL 代码的人也能进行数据分析,并从中获得有价值的信息和见解. 本文将详细介绍几种常用的数据可视化工具及其功能 ...
- Python批量改文件名
对以下路径中的文件名批量修改. 一.读取指定路径中的文件名 #导入标准库 import os #读取文件名 filesDir = "路径--" fileNameList = os. ...
- 【译】拥抱 SQL Server 2022 与 SSDT 17.8:揭示关键更新
在数据库开发的动态场景中,SQL Server Data Tools(SSDT)是 Visual Studio 生态系统中数据库开发人员的强大工具.SSDT 17.8 包含在最新版本的 Visual ...
- [ICPC2014 WF] Pachinko
[ICPC2014 WF] Pachinko 题面翻译 题目描述 有一个宽度为 \(w\) 高度为 \(h\) 的方格纸, $ w \times h$ 的格子中,有一些是空的,有一些是洞,有一些是障碍 ...
- 神奇的 SQL ,高级处理之 Window Functions → 打破我们的局限!
开心一刻 今天儿子跟老婆聊天 儿子:妈妈,我为什么没有两个爸爸呀 老婆:每个人都只有一个爸爸呀,你看谁有两个爸爸了 儿子一脸真诚的看着老婆:那你为什么就有两个爸爸呢 老婆一脸疑惑的望向儿子:我哪有两个 ...
- 神经网络优化篇:详解正则化(Regularization)
正则化 深度学习可能存在过拟合问题--高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有 ...
- 实用指南:打造卓越企业BI实施解决方案
前言 随着大数据时代的到来,商业智能(BI)工具变得非常重要.一个全面的商业智能方案可以支持数据驱动的决策并提高决策效率,同时还可以准确反映企业运行状态,为企业持续增长提供新的动力.本文小编将为大家介 ...