我正在使用gsheets package来向GoogleElectron 表格中同步读写数据.我单击主页上AppBar()上的按钮,将一行添加到数据库中.该行已成功添加到Electron 表格中.代码如下:

// import statements

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool viewNotebooks = false;
  bool viewList = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leadingWidth: 650,
        leading: Row(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            // code irrelevant to this question, then
            TextButton.icon(
                icon: const Icon(Icons.note_add_outlined),
                label: const Text("New Note"),
                onPressed: () async {
                  await Data.addNote(
                      title: 'New Note', content: '[content goes here]');
                  setState(() {});
                }),
            // more code 
          ],
        ),
      ),
      body: Row(
        children: [
          // more code
          viewList
              ? const Expanded(
                  flex: 1,
                  child: NotesListView(),
                )
              : Container(),
          // more code
        ],
      ),
    );
  }
}

然后,A ListView.builder()应该重建以将新行的数据包含在其项中.以下是相关代码,位于单独的.dart文件中:

import 'package:flutter/material.dart';
import '../providers/sheets_api.dart';

class NotesListView extends StatefulWidget {
  const NotesListView({super.key});

  @override
  State<NotesListView> createState() => _NotesListViewState();
}

class _NotesListViewState extends State<NotesListView> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: Data.getRows(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(
           child: CircularProgressIndicator(),
         );
        }
        if (snapshot.hasData) {
          return ListView.builder(
            shrinkWrap: true,
            itemCount: snapshot.data!.length,
            itemBuilder: (context, index) {
              return ListTile(
                  title: Text(snapshot.data![index][1]),
                  subtitle: Text(snapshot.data![index][2]),
                  onTap: () async {
                    var id = snapshot.data![index][0];
                    // print(await Data.getNoteById(id));
                  });
            },
          );
       } else {
          return const Center(
            // render the loading indicator
           child: CircularProgressIndicator(),
          );
        }
      },
    );
  }
}

然而,当Electron 表格内容更改时,该小部件会进行not重建.但当我将代码放入应用程序的main.dart文件中时,即使是在_NotesListViewState之外的小部件中,UI does也会按预期重建.

Widget notesListView() {
  return FutureBuilder (
  // rest of code

我很难理解发生了什么.我读过有关Building Contexts和小部件树以及键的内容,我认为这是关于Building Contexts for NotesListView在主应用程序的小部件树之外的事情吗?但我真的不明白,如果是这样的话,我不知道如何让NotesListView个独立(具有自己的Build Content)同时仍然可以在主应用程序的上下文中看到.我知道我可以使用Provider之类的东西来控制小部件重建的时间,或者只是在主页中保留自定义notesListView小部件,但我想了解这里发生了什么.

推荐答案

我假设这里的原因是const字:

viewList
              ? const Expanded(
                  flex: 1,
                  child: NotesListView(),
                ) ...

作为一个选项,您可以添加键:

viewList
              ? const Expanded(
                  flex: 1,
                  child: NotesListView(key: UniqueKey()),//or other type of key
                ) ...

每次重建父级时,它都会重建小部件.或者您可以在NotesListView中重写方法didUpdateWidget()并再次调用future:

Data.getRows()

当父小部件重建时.

Flutter相关问答推荐

我希望我的flutter容器具有与css类似的squireCircle UI

如何在容器中移动图标按钮?

如何让GridView.builder用另外两个小部件来占据屏幕的剩余部分

如何从外部控制有状态窗口小部件本身?

try 在Flutter应用程序中传递变量到FirebaseFirestore Where子句

如何使一个悬浮的appbar在flutter?

如何在Flutter 中播放音频

Android NFC未收到空的NFC标签

Flutter 动画列表一次构建所有项目,而不是仅构建可见的项目

使用Future函数的容器中未显示图像,但在使用图像小工具时显示

在 Flutter 中使用条件语句设置 ImageProvider Object 类型的背景图像

无法应用插件com.chaquo.python

我无法找到修复此错误的位置,指出无法使用静态访问来访问实例成员

像图像一样Flutter 自定义标签

flutter 创建一个带有 2 个图标的按钮

如何将金钱格式化为数以百万计的Flutter 动?

单元测试中如何比较NaN和NaN是否相等

仅使用 Flutter 在本地环境中托管 Web 服务器

避免长单词中断

Textfield 和 MasonryGrid 给出错误(垂直视口的高度没有限制)