Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何使用异步数据的提供程序?(颤振) 出身背景_Flutter_Provider_Sqflite - Fatal编程技术网

Flutter 如何使用异步数据的提供程序?(颤振) 出身背景

Flutter 如何使用异步数据的提供程序?(颤振) 出身背景,flutter,provider,sqflite,Flutter,Provider,Sqflite,我正在构建超级简单的TODO列表应用程序来练习颤振。如果输入字符串并单击“添加”,则文本将显示在上半部分的列表中 问题 何时以及如何调用model.getTasks()(=异步更新数据)和model.refresh()(=notifyListeners) 我发现列表没有立即更新,因为我没有对model.getTasks()使用wait。我试过这些,但我想知道是否有更好的方法 使用wait model.getTasks()并使build成为一个异步函数。-->编译错误 在model.refres

我正在构建超级简单的TODO列表应用程序来练习颤振。如果输入字符串并单击“添加”,则文本将显示在上半部分的列表中

问题 何时以及如何调用
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或on
notifyListeners()时,这个消费者每次都会获得新构建

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));
模型。刷新