【发布时间】:2019-03-12 04:03:41
【问题描述】:
我有一个名为savedListsList 的List,其中包含Objects 的列表。当应用程序启动时,此列表为空。当用户点击PopupMenuItem(在case 0: 案例中描述)时,从内部数据库加载数据,之后,显示数据的新屏幕出现(基本上是一个StatelessWidget,其中包含一个@ 987654327@ 有一定的行数)。
每一行都包含一个GestureDetector,用于监听左右滑动。
在每次这些滑动中都会调用updateSaveListItem。根据beingEdited 属性,前面提到的ListView.builder 内的行的外观发生了变化。
我知道滑动会触发属性相应地改变,因为我打印出来了。
很遗憾,updateSavedListItem 中的更改不会导致当前屏幕的重新渲染。当我热重载应用程序时,beingEdited 的更改会反映出来。
我很确定我可以让这个工作,当我打开
将ListView.builder 包围成StatefulWidget 的小部件。
但我的问题是:我可以用我描述的架构触发当前页面的重新渲染吗?因为我想在我的_MainPageclass 中保留尽可能多的state 管理。
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;
}
},
),
],
),
);
}
}
【问题讨论】: