【问题标题】:setState doens't cause re-render of new screen in fluttersetState 不会导致在颤动中重新渲染新屏幕
【发布时间】:2019-03-12 04:03:41
【问题描述】:

我有一个名为savedListsListList,其中包含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;
          }
        },
       ),
      ],
     ),
    );
   }
}

【问题讨论】:

    标签: dart flutter state


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2022-01-06
      • 1970-01-01
      • 2016-10-20
      • 2019-01-24
      • 2023-03-25
      相关资源
      最近更新 更多