Flutter 方法setState()未更新UI(颤振)
我的主屏幕是一个脚手架,其主体是一个ListView,底部是一个浮动操作按钮。操作按钮将用户带到第二个屏幕,在该屏幕上,用户可以在文本输入中键入文本,然后按save。save按钮调用主屏幕上的一个方法,将文本添加到ListView所基于的列表变量中。问题是:列表变量正在更新(我可以在日志上看到),但是setState没有更新ListView。我做错了什么 以下是主屏幕上的代码:Flutter 方法setState()未更新UI(颤振),flutter,dart,flutter-layout,setstate,flutter-widget,Flutter,Dart,Flutter Layout,Setstate,Flutter Widget,我的主屏幕是一个脚手架,其主体是一个ListView,底部是一个浮动操作按钮。操作按钮将用户带到第二个屏幕,在该屏幕上,用户可以在文本输入中键入文本,然后按save。save按钮调用主屏幕上的一个方法,将文本添加到ListView所基于的列表变量中。问题是:列表变量正在更新(我可以在日志上看到),但是setState没有更新ListView。我做错了什么 以下是主屏幕上的代码: import 'package:flutter/material.dart'; import 'addCounter.
import 'package:flutter/material.dart';
import 'addCounter.dart';
class Home extends StatefulWidget {
@override
HomeState createState() => HomeState();
}
class HomeState extends State<Home> {
List lista = <Widget>[];
void incrementLista(newItem) {
print('$lista');
setState(() {
lista.add(Box('newItem'));
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('List of Counters'),
backgroundColor: Colors.deepPurple[1000],
),
body: Builder(
builder: (context)=>
Center(
child: ListView(children: lista),
),),
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.grey[1000],
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddCounter(f: incrementLista)));
},
child: Icon(Icons.add, color: Colors.white)),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
bottomNavigationBar: BottomNavigationBar(
unselectedItemColor: Colors.grey[700],
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.list),
title: Text('Lista'),
),
BottomNavigationBarItem(
icon: Icon(Icons.insert_chart),
title: Text('Gráfico'),
),
],
selectedItemColor: Colors.blue,
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“addCounter.dart”;
类Home扩展了StatefulWidget{
@凌驾
HomeState createState()=>HomeState();
}
类HomeState扩展到State{
列表lista=[];
作废增量列表A(新建项){
打印(“$lista”);
设置状态(){
添加(框('newItem'));
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“计数器列表”),
背景颜色:颜色。深紫色[1000],
),
车身:建造商(
生成器:(上下文)=>
居中(
子项:ListView(子项:lista),
),),
浮动操作按钮:浮动操作按钮(
背景颜色:颜色。灰色[1000],
已按下:(){
导航器。推(
上下文
材料路线(
生成器:(context)=>AddCounter(f:incrementLista));
},
子项:图标(Icons.add,颜色:Colors.white)),
floatingActionButtonLocation:floatingActionButtonLocation.centerDocked,
底部导航栏:底部导航栏(
unselectedItemColor:颜色。灰色[700],
项目:常数[
底部导航气压计(
图标:图标(Icons.list),
标题:文本(“列表A”),
),
底部导航气压计(
图标:图标(图标。插入图表),
标题:文本(“Gráfico”),
),
],
选择编辑颜色:Colors.blue,
),
);
}
}
下面是addCounter.dart中的代码:
import 'package:flutter/material.dart';
class AddCounter extends StatefulWidget {
final Function f;
AddCounter({@required this.f});
@override
_AddCounterState createState() => _AddCounterState();
}
class _AddCounterState extends State<AddCounter> {
final myController = TextEditingController();
@override
void dispose() {
myController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Add a counter'),
backgroundColor: Colors.blue,
),
body: Column(children: [
Padding(
padding: EdgeInsets.all(15),
child: TextField(
controller: myController,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.blue, width: 2)),
hintText: 'Type a name for the counter'),
),
),
RaisedButton(
color: Colors.green,
onPressed: () {
widget.f(myController.text);
Navigator.pop(context);
},
child: Text(
'Save',
style: TextStyle(color: Colors.white),
),
)
]));
}
}
导入“包装:颤振/材料.省道”;
类AddCounter扩展StatefulWidget{
最终函数f;
AddCounter({@required this.f});
@凌驾
_AddCounterState createState()=>\u AddCounterState();
}
类_AddCounterState扩展状态{
最终myController=TextEditingController();
@凌驾
无效处置(){
myController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“添加计数器”),
背景颜色:Colors.blue,
),
正文:列(子项:[
填充物(
填充:边缘设置。全部(15),
孩子:TextField(
控制器:myController,
装饰:输入装饰(
enabledBorder:OutlineInputBorder(
borderSide:borderSide(颜色:Colors.blue,宽度:2)),
hintText:“键入计数器名称”),
),
),
升起的按钮(
颜色:颜色。绿色,
已按下:(){
widget.f(myController.text);
Navigator.pop(上下文);
},
子:文本(
“保存”,
样式:TextStyle(颜色:Colors.white),
),
)
]));
}
}
我认为Box小部件的代码与此无关。这基本上是一张有标题的卡片。@pskink给了我一个完美的答案。这是:
基本上,您不应该使用这样的小部件列表,数据层和表示层应该分开,相反,您应该只使用数据列表,有关更多信息,请参见共享AddCounter的代码。
lista
是一个小部件列表s?如果是这样,您需要在每次setState
被称为dhi@theCaptainXgod时创建一个全新的列表!我刚刚分享了AddCounter的代码!基本上,您不应该使用这样的小部件列表,数据层和表示层应该分开,相反,您应该只使用数据列表,有关更多信息,请参见:@pskink,是的,lista
是一个名为Box
的自定义小部件列表。要创建框
,我必须将字符串
作为参数传递。