dart - setState 不会导致在颤动中重新渲染新屏幕
问题描述
我有一个List
,称为savedListsList
,它包含一个列表Objects
。当应用程序启动时,此列表为空。当用户点击 a 时PopupMenuItem
(如case 0:
案例所示),数据会从内部数据库加载,之后会出现一个新屏幕,显示数据的位置(基本上 aStatelessWidget
包含ListView.builder
一定数量的行)。
每一行都由一个GestureDetector
监听左右滑动的 a 组成。在每次这些滑动updateSaveListItem
中都会调用。根据beingEdited
属性改变前面提到的行内的外观ListView.builder
。
我知道滑动会触发属性相应地更改,因为我将其打印出来。
不幸的是,更改updateSavedListItem
不会导致当前屏幕的重新渲染。当我热重新加载应用程序时,beingEdited
会反映变化。
当我将围绕的小部件ListView.builder
变成StatefulWidget
. 但我的问题是:我可以用我描述的架构触发当前页面的重新渲染吗?因为我想state
在我的_MainPage
class
.
class _MainPage extends State<MainPage> {
List<SavedListObj> savedListsList = List();
@override
void initState() {
savedListsList = List();
}
void updateSavedListItem(int id, String action, String newName) {
setState(() {
switch (action) {
case 'beingEditedStart':
savedListsList[id].beingEdited = true;
break;
case 'beingEditedEnd':
savedListsList[id].beingEdited = false;
break;
case 'delete':
break;
case 'edit':
break;
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: <Widget>[
PopupMenuButton(
onSelected: (value) {
switch (value) {
case 0:
DB db = DB();
db.getListNames().then((queryResult) {
savedListsList.clear();
setState(() {
savedListsList.addAll(queryResult);
});
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SavedListsPage(
savedListsList,
updateSavedListItem,
),
),
);
break;
}
},
),
],
),
);
}
}
解决方案
不,你不能那样做!当您必须更新应用程序的状态时,您必须使用 Stateful 小部件。如需进一步参考,您可以参考此链接。
推荐阅读
- javascript - addEventListener 函数在开始时工作而不会被触发
- f# - 使用不可变列表创建具有链接节点的邻接列表
- python - 为什么它不打印这个变量?
- postgresql - Peewee 将字段更新为函数的结果
- nginx - 在 nginx 日志文件名中包含日期
- azure-active-directory - /v1.0/me 端点 preferredLanguage 属性源
- c# - C# 如何在构建中包含 DLL 依赖项?
- angular - Angular 6 - 'observable' 类型上不存在 rxjs 属性'map'
- docker - 是否可以与多个 Docker 容器共享 USB GPS 加密狗?
- css - Windows 上的 CSS 网格开发环境