flutter - Flutter Provider:如何通过提供者获取我应该通过上下文传递的对象?
问题描述
我正在尝试在整个应用程序中使用 Moor DB 类,但遇到了一些问题:
我这样传递:
class MyApp extends StatelessWidget {
final appDatabase = AppDatabase();
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
Provider<AppDatabase>(create: (_) => appDatabase),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primaryColor: Colors.yellow,
scaffoldBackgroundColor: Colors.blue,
cardColor: Colors.yellow,
),
home: FirstPage(),
),
);
}
我应该在FirstPage
但不知道如何使用它。
我有这个AppDatabase
对象:
...
class _FirstPageState extends State<FirstPage> {
late AppDatabase appDatabase;
...
}
在运行开始FirstPage()
时initState
:
@override
void initState() {
super.initState();
refreshMyItem();
}
它调用了refreshMyItem()
什么需要AppDatabase
对象:
refreshMyItem() async {
final myDao = appDatabase.myDao;
int id = await myDao.insertOrUpdateMyItem(myitem);
MyItemsCompanion temp = (await myDao.getById(id)).toCompanion(true);
setState(() {
myitem = temp;
});
}
在构建方法中,我初始化了,appDatabase
因为这里我有context
:
@override
Widget build(BuildContext context) {
appDatabase = Provider.of<AppDatabase>(context, listen: false);
return Text(myitem.toString());
}
而问题就在这里……
所以在第一次initState()
运行时,什么叫做refreshMyItem()
需要appDatabase
,但它是空的,因为build()
应该在initState()
......之后调用
A 等待 B 运行,而 B 等待 A 运行...
有什么办法可以解决这个问题?
解决方案
推荐阅读
- node.js - NodeJS 本身在 Windows 上保存文件 EBUSY?
- php - foreach() 在文件写入时添加空行
- python - 将 Dask Series 对象转换为时间戳
- google-drive-api - 如何通过 API 将 pptx 文件转换为 Google 幻灯片演示文稿?
- http - 如何使用 golang 服务器检查隐式设置的 http 标头?
- linux - 删除进程的 RT prio
- asp.net-mvc - 检查 Azure 作业的整体进度并将其发送到 ASP.NET 视图
- laravel - 如何挂钩 laravel nova 中资源的删除事件?
- laravel - CamelCase 类型控制器的视图文件夹的命名约定是什么
- php - 我的 Unicode 保护方案是否完整?是否有保护 Unicode 字符串的内置方法?