我已经从flutter创建了一个sqlite crud应用程序。我的应用程序数据插入到表中成功。但当我显示从列表视图插入的日期需要重新加载app.in我的应用程序数据插入从一个单独的屏幕。数据已显示在主屏幕上。我想显示数据而不重新加载应用程序在列表视图中我怎么能解决我的问题?
这是我的应用程序代码。这是我的主屏幕。这个屏幕显示来自listview的数据。
FutureBuilder<List<Student>>(
future: DatabaseHelper.instance.getStudentDetails(),
builder: (BuildContext context,
AsyncSnapshot<List<Student>> snapshot) {
if (!snapshot.hasData) {
return Center(child: Text('Loading...'));
}
return snapshot.data!.isEmpty
? Center(child: Text('No Student Details in List.'))
: ListView(
children: snapshot.data!.map((student) {
return Center(
child: Card(
color: selectedId == student.id
? Colors.white70
: Colors.white,
child: ListTile(
title: Text(
'Student Name : ${student.name}'),
subtitle:
Text('Course : ${student.course}'),
onTap: () {},
onLongPress: () {
setState(() {
DatabaseHelper.instance
.remove(student.id!);
});
},
),
),
);
}).toList(),
);
}),
这是我的第二个屏幕。这个屏幕我添加数据插入到sqlite表。当我点击浮动操作按钮时,我想在主屏幕列表视图中显示插入数据,而无需重新加载。
Column(
children: [
SizedBox(
height: 10.0,
),
Text(
'Enter Student Details',
style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
),
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Divider(color: Colors.black),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
decoration: InputDecoration(
label: Text('Enter Name :'),
),
controller: nameController,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
decoration: InputDecoration(
label: Text('Enter Course :'),
),
controller: courseController,
),
),
],
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.save),
onPressed: () async {
await DatabaseHelper.instance.add(
Student(name: nameController.text, course: courseController.text),
);
setState(() {
nameController.clear();
courseController.clear();
selectedId = null;
});
},
),
1条答案
按热度按时间brccelvz1#
future: DatabaseHelper.instance.getStudentDetails(),
将在每次setState(构建)时调用API。为了避免调用API,在state类上为这个
future
创建一个state变量(在build方法之外)。并在
FutureBuilder
上使用它你可以查一下兰德尔·L·施瓦茨的Fixing a common FutureBuilder and StreamBuilder problem。