flutter - IndexedStack小部件未更新

标签 flutter dart flutter-layout

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

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

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

我是否需要每次手动重新加载学生列表小部件?
有没有办法做到这一点?
或者,还有其他方法可以告诉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(),
        );
      }
   },
  );
}

最佳答案

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

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

关于flutter - IndexedStack小部件未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716056/

相关文章:

flutter - 获取屏幕抖动的物理尺寸

android - 如何打开Isar检查器

dart - 如何在 Flutter 中从 PageView onPageChanged 中的索引获取?

dart - 如何使用 ScriptProcessorNode

php - Dart 与 PHP 代码中的不同哈希结果

dart - 导航未定义名称上下文

flutter - 如何使 StarRating 小部件对齐左侧

flutter - 如何根据 flutter 中的父小部件高度设置图标按钮启动半径

Flutter 运行卡在白屏上

android - Flutter:无法发出 HTTP-GET 请求