作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
我正在构建用于练习 Flutter 的 super 简单的待办事项列表应用程序。如果输入字符串并单击“添加”,则文本将显示在上部列表中。
题
我应该何时以及如何调用 model.getTasks()
(= 异步更新数据)和 model.refresh()
(= notifyListeners
)?
我发现列表没有立即更新,因为我不使用 await
为 model.getTasks()
.我试过这些,但我想知道是否有更好的方法。
await model.getTasks()
并制作 build
一个异步函数。 --> 编译错误 await model.getTasks()
就在之前 model.refresh()
. --> model.tasks
渲染前未更新 ListView
打开应用程序时。 model.getTasks()
创建新任务时调用两次。 model.tasks
是 List<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/
我是一名优秀的程序员,十分优秀!