首页 > 解决方案 > 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;
          }
        },
       ),
      ],
     ),
    );
   }
}

标签: dartflutterstate

解决方案


不,你不能那样做!当您必须更新应用程序的状态时,您必须使用 Stateful 小部件。如需进一步参考,您可以参考此链接


推荐阅读