Flutter 如何使用异步数据的提供程序?(颤振) 出身背景
我正在构建超级简单的TODO列表应用程序来练习颤振。如果输入字符串并单击“添加”,则文本将显示在上半部分的列表中 问题 何时以及如何调用Flutter 如何使用异步数据的提供程序?(颤振) 出身背景,flutter,provider,sqflite,Flutter,Provider,Sqflite,我正在构建超级简单的TODO列表应用程序来练习颤振。如果输入字符串并单击“添加”,则文本将显示在上半部分的列表中 问题 何时以及如何调用model.getTasks()(=异步更新数据)和model.refresh()(=notifyListeners) 我发现列表没有立即更新,因为我没有对model.getTasks()使用wait。我试过这些,但我想知道是否有更好的方法 使用wait model.getTasks()并使build成为一个异步函数。-->编译错误 在model.refres
model.getTasks()
(=异步更新数据)和model.refresh()
(=notifyListeners
)
我发现列表没有立即更新,因为我没有对model.getTasks()使用wait
。我试过这些,但我想知道是否有更好的方法
- 使用
wait model.getTasks()
并使build
成为一个异步函数。-->编译错误
- 在
model.refresh()之前添加wait model.getTasks()
<代码>模型。任务
在打开应用程序时呈现<代码>列表视图
之前不会更新<创建新任务时,会调用两次代码>模型.getTask()
截图
代码详细信息
是model.tasks
,它用于存储从数据库中获取的任务(List
)sqflite
是一个异步函数,用于从数据库获取数据并覆盖model.getTasks()
model.tasks
仅用于调用model.refresh()
notifyListeners()
是模型的TodoListPage
的侦听器notifyListeners
类TodoListPage扩展了无状态小部件{
最终文本编辑控制器_textFieldController=文本编辑控制器();
@凌驾
小部件构建(构建上下文){
打印('TodoListPage.build');
最终模型=提供者(上下文);
model.getTasks();
Future createTask()异步{
TaskData TaskData=await-DatabaseHandler()
.insertTask(新任务数据(名称:_textFieldController.text));
model.refresh();
}
返回脚手架(
appBar:appBar(
标题:正文(
“待办事项列表”,
),
),
正文:专栏(
儿童:[
容器(
身高:150,
子项:ListView.builder(
itemBuilder:(构建上下文,int索引){
返回文本(model.tasks[index].name);
},
itemCount:model.tasks.length,
),
),
正文(
“添加”,
),
形式(
子:列(
儿童:[
TextFormField(
控制器:_textFieldController,
),
升起的按钮(
已按下:(){
打印('onPressed');
打印(_textFieldController.text);
createTask();
},
子项:文本('New'),
),
],
),
)
],
),
);
}
}
您可以在StatefulWidget
中使用FutureBuilder
:
class TodoListPage extends StatefulWidget {
@override
_TodoListPageState createState() => _TodoListPageState();
}
class _TodoListPageState extends State<TodoListPage> {
TodoListModel model;
Future<List<Tasks>> _getTasks;
@override
void didChangeDependencies() {
model = Provider.of<TodoListModel>(context);
_getTasks = model.getTasks();
}
@override
Widget build() {
FutureBuilder<List<Tasks>>(
future: _getTasks,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Text("Loading tasks...");
}
final tasks = snapshot.data;
// ...
}
);
}
}
类TodoListPage扩展了StatefulWidget{
@凌驾
_TodoListPageState createState()=>\u TodoListPageState();
}
类_TodoListPageState扩展了状态{
TodoListModel模型;
未来的任务;
@凌驾
void didChangeDependencies(){
model=Provider.of(上下文);
_getTasks=model.getTasks();
}
@凌驾
小部件构建(){
未来建设者(
未来:_getTasks,
生成器:(上下文,快照){
if(snapshot.connectionState!=connectionState.done){
返回文本(“加载任务…”);
}
最终任务=snapshot.data;
// ...
}
);
}
}
在您的模型中:
Future<List<Tasks>> getTasks() async {
if (tasks == null) {
tasks = await loadFromDatabase();
}
return tasks;
}
Future gettask()异步{
如果(任务==null){
tasks=等待loadFromDatabase();
}
返回任务;
}
您可以在StatefulWidget
中使用FutureBuilder
:
class TodoListPage extends StatefulWidget {
@override
_TodoListPageState createState() => _TodoListPageState();
}
class _TodoListPageState extends State<TodoListPage> {
TodoListModel model;
Future<List<Tasks>> _getTasks;
@override
void didChangeDependencies() {
model = Provider.of<TodoListModel>(context);
_getTasks = model.getTasks();
}
@override
Widget build() {
FutureBuilder<List<Tasks>>(
future: _getTasks,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Text("Loading tasks...");
}
final tasks = snapshot.data;
// ...
}
);
}
}
类TodoListPage扩展了StatefulWidget{
@凌驾
_TodoListPageState createState()=>\u TodoListPageState();
}
类_TodoListPageState扩展了状态{
TodoListModel模型;
未来的任务;
@凌驾
void didChangeDependencies(){
model=Provider.of(上下文);
_getTasks=model.getTasks();
}
@凌驾
小部件构建(){
未来建设者(
未来:_getTasks,
生成器:(上下文,快照){
if(snapshot.connectionState!=connectionState.done){
返回文本(“加载任务…”);
}
最终任务=snapshot.data;
// ...
}
);
}
}
在您的模型中:
Future<List<Tasks>> getTasks() async {
if (tasks == null) {
tasks = await loadFromDatabase();
}
return tasks;
}
Future gettask()异步{
如果(任务==null){
tasks=等待loadFromDatabase();
}
返回任务;
}
设置ChangeNotifierProvider
时,它会调用TodoListModel()
只有一次refreshttasks()
这与Widget build()中的model.getStartks()类似
然后,我将消费者尽可能深地放在小部件树中
当我按下RaiseButton或onnotifyListeners()时,这个消费者每次都会获得新构建代码>
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
类TodoList扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
ChangeNotifierProvider(创建:(上下文)=>TodoListModel()),
],
儿童:TodoListPage()
);
}
}
类TodoListPage扩展了无状态小部件{
最终文本编辑控制器_textFieldController=文本编辑控制器();
@凌驾
小部件构建(构建上下文){
打印('TodoListPage.build');
//侦听:false,如果提供程序发送e notify,则此部分不会刷新
最终模型=Provider.of(上下文,listen:false);
//我将这个未来放在TodoListModel类中
/*Future createTask()异步{
//TaskData TaskData=await DatabaseHandler().insertTask(新任务数据(名称:_textFieldController.text));
模型。刷新