Flutter 当数据库获得新数据时,如何更新FutureBuilder?
我正在创建一个待办事项列表应用程序。我有一个FutureBuilder小部件,可以处理任务的所有内容。然后我有另一个小部件,其中有两个浮动操作按钮,其中一个从sql中删除表,另一个打开另一个小部件向数据库添加任务。他们两个都工作。但我必须重新加载应用程序才能看到更改。我看到有两个像这样的问题,但没有明确的答案,我花了大约一个小时寻找答案,但我什么也找不到 这是我有两个操作按钮的小部件Flutter 当数据库获得新数据时,如何更新FutureBuilder?,flutter,dart,sqflite,Flutter,Dart,Sqflite,我正在创建一个待办事项列表应用程序。我有一个FutureBuilder小部件,可以处理任务的所有内容。然后我有另一个小部件,其中有两个浮动操作按钮,其中一个从sql中删除表,另一个打开另一个小部件向数据库添加任务。他们两个都工作。但我必须重新加载应用程序才能看到更改。我看到有两个像这样的问题,但没有明确的答案,我花了大约一个小时寻找答案,但我什么也找不到 这是我有两个操作按钮的小部件 class FloatingActionButtons extends StatelessWidget {
class FloatingActionButtons extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<DataProvider>(
builder: (context, data, child) {
return Padding(
padding: const EdgeInsets.all(10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
FloatingActionButton(
backgroundColor: Color(0xFF25202B),
onPressed: () {
data.deleteAll();
},
child: Icon(Icons.clear, size: 30.0, color: Colors.white),
),
FloatingActionButton(
backgroundColor: Color(0xFF25202B),
onPressed: () {
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) => AddTaskScreen());
},
child: Icon(Icons.add, size: 30.0, color: Colors.white),
),
],
),
);
},
);
}
}
class FloatingActionButtons扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
退货消费者(
生成器:(上下文、数据、子对象){
返回填充(
填充:常数边集全部(10.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
浮动操作按钮(
背景颜色:颜色(0xFF25202B),
已按下:(){
data.deleteAll();
},
子项:图标(图标。清晰,大小:30.0,颜色:彩色。白色),
),
浮动操作按钮(
背景颜色:颜色(0xFF25202B),
已按下:(){
showModalBottomSheet(
上下文:上下文,
是的,
生成器:(上下文)=>AddTaskScreen());
},
子项:图标(Icons.add,大小:30.0,颜色:Colors.white),
),
],
),
);
},
);
}
}
这是我有FutureBuilder的小部件
class DisplayTasks extends StatefulWidget {
@override
_DisplayTasksState createState() => _DisplayTasksState();
}
class _DisplayTasksState extends State<DisplayTasks> {
final db = DBHelper.instance;
Future<List<Task>> tasks;
void updateTasksList() {
setState(() {
tasks = db.getTaskList();
});
}
void toggleDone(Task task) {
setState(() {
if (task.isDone == 0) {
task.isDone = 1;
} else {
task.isDone = 0;
}
db.update(task);
});
}
void deleteTask(String taskName) {
setState(() {
db.deleteTask(taskName);
});
}
void insert(taskName, isDone) {
setState(() {
db.insertTask(Task(
taskName: taskName,
isDone: isDone,
));
});
}
@override
void initState() {
super.initState();
updateTasksList();
}
@override
Widget build(BuildContext context) {
updateTasksList();
return Expanded(
child: FutureBuilder(
future: tasks,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: Text(
'No tasks added yet.',
style: TextStyle(
fontSize: 30.0,
fontWeight: FontWeight.bold,
),
),
);
}
if (snapshot.hasError) {
return Center(
child: Text('Future Error'),
);
}
return ListView.builder(
itemCount: snapshot.data.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return GestureDetector(
onLongPress: () {
deleteTask(snapshot.data[index].taskName);
},
onTap: () {
toggleDone(snapshot.data[index]);
},
child: Container(
padding:
EdgeInsets.symmetric(vertical: 20.0, horizontal: 10.0),
margin:
EdgeInsets.symmetric(horizontal: 30.0, vertical: 10.0),
decoration: BoxDecoration(
color: Color(0xFF252030),
borderRadius: BorderRadius.circular(15.0)),
child: Center(
child: Text(
'${snapshot.data[index].taskName}',
style: TextStyle(
decoration: snapshot.data[index].isDone == 0
? TextDecoration.none
: TextDecoration.lineThrough,
fontSize: 18.0,
fontWeight: FontWeight.bold,
textBaseline: TextBaseline.ideographic),
),
),
),
);
},
);
}),
);
}
}
类DisplayTasks扩展StatefulWidget{
@凌驾
_DisplayTasksState createState()=>\u DisplayTasksState();
}
类_DisplayTasksState扩展状态{
final db=DBHelper.instance;
今后的任务;
void updateTaskList(){
设置状态(){
tasks=db.getTaskList();
});
}
void toggleDone(任务){
设置状态(){
如果(task.isDone==0){
task.isDone=1;
}否则{
task.isDone=0;
}
数据库更新(任务);
});
}
void deleteTask(字符串taskName){
设置状态(){
db.deleteTask(任务名称);
});
}
无效插入(任务名,isDone){
设置状态(){
db.insertTask(任务(
taskName:taskName,
isDone:isDone,
));
});
}
@凌驾
void initState(){
super.initState();
updateTaskList();
}
@凌驾
小部件构建(构建上下文){
updateTaskList();
扩大回报(
孩子:未来建设者(
未来:任务,
生成器:(上下文,快照){
如果(!snapshot.hasData){
返回中心(
子:文本(
“尚未添加任何任务。”,
样式:TextStyle(
字体大小:30.0,
fontWeight:fontWeight.bold,
),
),
);
}
if(snapshot.hasError){
返回中心(
子项:文本(“未来错误”),
);
}
返回ListView.builder(
itemCount:snapshot.data.length,
收缩膜:对,
itemBuilder:(上下文,索引){
返回手势检测器(
onLongPress:(){
deleteTask(snapshot.data[index].taskName);
},
onTap:(){
切换完成(snapshot.data[index]);
},
子:容器(
衬垫:
边缘组。对称(垂直:20.0,水平:10.0),
保证金:
边缘组。对称(水平:30.0,垂直:10.0),
装饰:盒子装饰(
颜色:颜色(0xFF252030),
边界半径:边界半径。圆形(15.0)),
儿童:中心(
子:文本(
“${snapshot.data[index].taskName}”,
样式:TextStyle(
装饰:snapshot.data[index].isDone==0
?无
:textEdition.lineThrough,
字体大小:18.0,
fontWeight:fontWeight.bold,
textBaseline:textBaseline.ideographic),
),
),
),
);
},
);
}),
);
}
}
非常感谢所有能够提供帮助的人