将数据传递给提供者 - 在构建期间调用 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);
},
)
我在 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);
},
)