gpt4 book ai didi

flutter - 如何将 Provider 用于异步数据? ( flutter )

转载 作者:行者123 更新时间:2023-12-04 12:39:17 24 4
gpt4 key购买 nike

背景

我正在构建用于练习 Flutter 的 super 简单的待办事项列表应用程序。如果输入字符串并单击“添加”,则文本将显示在上部列表中。



我应该何时以及如何调用 model.getTasks() (= 异步更新数据)和 model.refresh() (= notifyListeners)?

我发现列表没有立即更新,因为我不使用 awaitmodel.getTasks() .我试过这些,但我想知道是否有更好的方法。

  • 使用 await model.getTasks()并制作 build一个异步函数。 --> 编译错误
  • 添加 await model.getTasks()就在之前 model.refresh() . --> model.tasks渲染前未更新 ListView打开应用程序时。 model.getTasks()创建新任务时调用两次。

  • 截屏

    App TODO list page

    代码详情
  • model.tasksList<Task> ,用于存储从 DB ( sqflite ) 获取的任务。
  • model.getTasks()是一个异步函数,用于从数据库获取数据并覆盖 model.tasks .
  • model.refresh()仅用于拨打 notifyListeners() .
  • TodoListPage是模型 notifyListeners 的监听器.
  • class TodoListPage extends StatelessWidget {
    final TextEditingController _textFieldController = TextEditingController();

    @override
    Widget build(BuildContext context) {
    print('TodoListPage.build');
    final model = Provider.of<TodoListModel>(context);
    model.getTasks();

    Future createTask() async {
    TaskData taskData = await DatabaseHandler()
    .insertTask(new TaskData(name: _textFieldController.text));
    model.refresh();
    }

    return Scaffold(
    appBar: AppBar(
    title: Text(
    'TODO List',
    ),
    ),
    body: Column(
    children: <Widget>[
    Container(
    height: 150,
    child: ListView.builder(
    itemBuilder: (BuildContext context, int index) {
    return Text(model.tasks[index].name);
    },
    itemCount: model.tasks.length,
    ),
    ),
    Text(
    'Add',
    ),
    Form(
    child: Column(
    children: <Widget>[
    TextFormField(
    controller: _textFieldController,
    ),
    RaisedButton(
    onPressed: () {
    print('onPressed');
    print(_textFieldController.text);
    createTask();
    },
    child: Text('New'),
    ),
    ],
    ),
    )
    ],
    ),
    );
    }
    }

    最佳答案

    您可以使用 FutureBuilder里面StatefulWidget :

    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;

    // ...
    }
    );
    }
    }

    在你的模型中:
    Future<List<Tasks>> getTasks() async {
    if (tasks == null) {
    tasks = await loadFromDatabase();
    }

    return tasks;
    }

    关于flutter - 如何将 Provider 用于异步数据? ( flutter ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61155623/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com