将数据传递给提供者 - 在构建期间调用 setState() 或 markNeedsBuild()

passing data to provider - setState() or markNeedsBuild() called during build

我在 main.dart 中使用 SQflite 从本地数据库中获取数据,并使用 FutureProvider 将其传递给 ProvideRecords 小部件:

Future<List<WeightRecord>> _getRecords() async {
  List<WeightRecord> records = await RecordsDatabase.instance.getRecords();

  return records;
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureProvider<List<WeightRecord>?>(
        create: (context) {
          return _getRecords();
        },
        initialData: [],
        catchError: (_, error) => [
          WeightRecord(
              date: DateTime.now(), weight: 00.0, note: 'hasError: $error')
        ],
        child: ProvideRecords(),
      ),
    );
  }
}

然后在 ProvideRecords 小部件中,我再次将数据传递给另一个提供者:

class ProvideRecords extends StatelessWidget {
  const ProvideRecords({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Consumer<List<WeightRecord>?>(builder: (context, list, child) {
                return MultiProvider(
              providers: [
                ChangeNotifierProvider(
                    create: (context) => RecordsListModel()),
                ChangeNotifierProvider(create: (context) => ButtonMode())
              ],
              builder: (context, child) {

         Provider.of<RecordsListModel>(context, listen: true)
                    .updateRecordsList(list);

                return Home(list: list);
              });
        }
     
    });
  }
}

代码有效,但我得到 setState() or markNeedsBuild() called during build.,因为我在构建器函数中使用了 Provider.of<RecordsListModel>(context, listen: true).updateRecordsList(list);。但是我找不到将数据从 FutureProvider 传递到 RecordListModel 的另一种方法,我该怎么办?

这主要是您如何构建代码的问题

建议在应用程序入口点设置多供应商..

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
       //my providers here
          ChangeNotifierProvider(create: (context) => ButtonMode())
       ... material app

那么添加数据的时候不需要设置listen为true

 Provider.of<RecordsListModel>(context, listen: false)
                    .updateRecordsList(list);

因为 home 依赖于来自上述提供者的数据,所以使用消费者

Home(list: list);

// 使用你的提供者

Consumer<RecordsListModel>(
              builder:
                  (context, RecordsListModel recordsP, child) {
                return Home(list:recordsP.list);
              },
            )