【问题标题】:IndexedStack widgets are not updatingIndexedStack 小部件未更新
【发布时间】:2019-08-29 18:34:25
【问题描述】:

我正在使用 IndexedStack 小部件并根据某些逻辑提供小部件列表。我有一个显示学生列表的列表页面和另一个添加新学生的页面。

当我添加新学生时,它添加成功并存储在 Firestore 中。但是当我切换回瞳孔的列表页面时,它不会显示新添加的瞳孔。它显示除了最后一个创建的学生之外的所有其他学生。如果我关闭应用程序并再次打开,它会显示所有学生,包括添加的学生。

我放了一些日志,发现小部件构建函数在应用程序加载的第一次被调用。 下次从缓存加载小部件时,我猜是因为没有调用构建函数。

我是否需要每次手动重新加载学生列表小部件? 有没有办法做到这一点? 或者还有其他方法可以告诉 IndexedStack 小部件每次都重新加载小部件。 如何在不重新启动应用的情况下,在列表页面中获取新添加的学生?

IndexedStack 代码:

body: Center(
    child: IndexedStack(
      index: _selectedPage,
      children: this._widgets,
    ),
  )

学生列表页面代码:

@override
Widget build(BuildContext context) {
Logger _logger = Logger(this.runtimeType.toString());
_logger.fine('Loading pupils listing page.');
return StreamBuilder<QuerySnapshot>(
  stream: _querySnapshot,
  builder: (BuildContext context, 
AsyncSnapshot<QuerySnapshot>        snapshot) {
    if (snapshot.data == null) 
return   FrequentWidgets().getProgressBar();
    if (snapshot.hasError) return Text('Error: ${snapshot.error}');
    switch (snapshot.connectionState) {
      case ConnectionState.waiting:
        return Text('Loading...');
      default:
        return ListView(
          children: snapshot.data.documents.map(
            (DocumentSnapshot document) {
              return ListTile(
                trailing: Icon(Icons.person),
                title: Text(document["nam"]),
                onTap: () {
                  appData.pupilId = document.documentID;
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => HomePage(
                        sectionType:  
 SectionType.InstructorActivityForPupil,
                        userType: UserType.Instructor,
                        contextInfo: {
                          DataSharingKeys.PupilIdKey: 
document.documentID
                        },
                      ),
                    ),
                  );
                },
              );
            },
          ).toList(),
        );
      }
   },
  );
}

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    IndexedStack 小部件的目的是在多个小部件中一次显示一个小部件。但是,IndexedStack 将构建并加载在加载期间传递给它的所有小部件。然后,请求的小部件将从缓存中显示,而无需实际构建小部件。 这就是为什么传递的小部件的构建方法在应用程序加载期间只会获得一次。后续请求将从缓存中显示。

    我使用了 TabBarView 而不是 IndexedStack 小部件。 TabBarView 具有几乎相同的目标,但提供的小部件将在每个请求时被调用。

    【讨论】:

    • 这确实应该在文档中。感谢您提供这些知识
    • 不客气
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2012-08-23
    相关资源
    最近更新 更多