IndexedStack小部件没有更新。

5
我正在使用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(),
        );
      }
   },
  );
}
2个回答

14

IndexedStack widget的作用是在多个widget中显示一个widget。但是,IndexedStack会在加载时构建和加载传递给它的所有widget。然后,请求的widget将从缓存中显示,而不实际构建widget。 这就是为什么传递的widget的build方法仅在应用程序加载期间获取一次。随后的请求将从缓存中显示。

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


2
这个内容真的应该在文档中。感谢您提供这些知识。 - ChillBroDev

3
为了理解这个问题,您首先需要了解小部件树和元素树。解决方案是,在您想要使用新的项目列表刷新小部件时,将一个新的唯一键传递到该小部件中即可解决此问题。 IndexedStack( index: selectedIndex, children:list, key:ObjectKey(list[0].hashCode))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接