首页 > 解决方案 > 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 运行...

有什么办法可以解决这个问题?

标签: flutterdartprovider

解决方案


推荐阅读