flutter - Flutter:如何从另一个有状态类更新 UI 有状态小部件
问题描述
当另一个有状态小部件中的值更改时,如何更新我的 UI?
我创建了一个构建小部件的有状态类(Test2)。然后在我的主课中,我有一个 Test2 小部件列表。最后,我正在遍历列表并呈现 Test2 小部件。
但是,我想更新 Test2 小部件之一中的值,然后相应地更新主 UI。
我怎样才能做到这一点?
文件:test2.dart
class Test2 extends StatefulWidget {
Test2({this.responseId, this.message});
final String responseId;
final String message;
bool strike =false;
@override
_Test2State createState() => _Test2State();
}
class _Test2State extends State<Test2> {
@override
Widget build(BuildContext context) {
return Container(
child: Text(
widget.responseId + widget.message,
style: (widget.strike)?TextStyle(decoration: TextDecoration.none):TextStyle(decoration: TextDecoration.underline)
),
);
}
}
文件:home.dart
主要课程
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<Test2> _counter =List();
int cnt =0;
@override
void initState() {
super.initState();
_counter.add(Test2(message: "message",responseId:"1"));
_counter.add(Test2(message: "message",responseId:"2"));
_counter.add(Test2(message: "message",responseId:"3"));
}
在我的构建方法中
for(int i=0;i<_counter.length;i++)...[
_counter[i]
],
按钮点击
void _incrementCounter() {
for(int i=0;i<_counter.length;i++){
if(_counter[i].responseId =="1"){
_counter[i].strike =true;
}
}
setState(() {
});
}
解决方案
您可以使用它ValueNotifier
来重建侦听器。
ValueNotifier<bool>
在类中声明 aText2
并初始化它。
ValueNotifier<bool> strikeNotifier = ValueNotifier(false);
然后用于ValueListenableBuilder
包装要在值strike
更改时重建的小部件。
ValueListenableBuilder(valueListenable: strikeNotifier, builder: (_, result, widget) => Text(...),)
并创建一个更新 的值的方法strike
,也用于比较新旧值,ValueNotifier
并根据比较结果更新 的值。
void updateStrike(bool value){
var result = (strike == value);
strike = value;
strikeNotifier.value = result;
}
因此,您可以更新strike
with updateStrike()
in的值_incrementCounter()
以通知Text2
小部件进行重建。
推荐阅读
- arrays - 如何强制从 Observable 返回的对象类型到 Angular 中的对象数组?
- java - java - 如何使用包含数组的参数调用图形方法?
- flask - 在 Flask-Admin 的内置模板中添加填充其他字段的按钮
- amazon-dynamodb - DynamoDB w/ Serverless,使用 Fn::GetRef 来引用全局二级索引
- marklogic - Marklogic 9 重新平衡器不适用于分配的查询策略
- c - Visual Studio Code 不包含 C 头文件
- python - 如何在 Python 中调整全限定类名的模块部分?
- c# - 如何找出鼠标悬停在代码中创建的图片框?
- tensorflow - 需要张量操作的keras(tf后端)中的自定义损失
- git - PyCharm:冲突文件显示为普通文件