我正在使用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
小部件,但我想了解这里发生了什么.