flutter - 当数据库获取新数据时,如何使 FutureBuilder 更新?
问题描述
我正在构建一个待办事项列表应用程序。我有一个 FutureBuilder 小部件,我可以在其中处理有关任务的所有内容。然后我有另一个小部件,其中有两个浮动操作按钮,其中一个从 sql 中删除表,另一个打开另一个小部件以向数据库添加任务。他们都工作。但我必须重新加载应用程序才能看到更改。我看到有两个像这样的问题,但没有明确的答案,我花了大约一个小时寻找答案,但我什么也找不到。
这是我有两个操作按钮的小部件。
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),
),
],
),
);
},
);
}
}
这是我拥有 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),
),
),
),
);
},
);
}),
);
}
}
非常感谢任何能够提供帮助的人!
解决方案
推荐阅读
- python - 是否可以使用 python 的 pynput 发送变量?
- bash - 简化对 printf bash 的重复输入
- forms - SharePoint 列表表单文本字段到下拉列表
- javascript - Javascript在2个对象数组上按键合并和替换值
- oracle - Oracle:想要将 Substring 转换为可用的、可排序的日期
- ms-access - 在访问查询中使用退格 - CHR(8)
- python - 在 Flask 应用程序中使用的 RadioField Wtforms 的自定义小部件未设置已检查
- python - Python - 将科学记数法转换为使用前缀的函数(例如,毫、微)
- .net - 正则表达式用逗号分隔,不在括号内(.NET)
- mysql - 在 Google DataStudio 上访问 Google Cloud VM (mysql)