Таким образом, похоже, что вы не создали поставщика для Studyjios
в своем дереве виджетов, у вас есть несколько вариантов при этом, и выбор лучшего зависит от того, где еще вы хотите использовать то же самое. provider.
Если вам когда-либо понадобится использовать Provider.of<Studyjios>
внутри StudyjiosList
, вы можете создать поставщика внутри этого класса, как показано ниже:
class StudyjiosList extends StatelessWidget {
final bool showMine;
final bool showJoined;
StudyjiosList(this.showMine, this.showJoined);
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Studyjios>(
create: (context) => Studyjios(),
child: buildStudyjios(context),
);
}
Widget buildStudyjios(context) {
final studyjiosData = Provider.of<Studyjios>(context);
final studyjios =
showMine ? studyjiosData.myStudyjios : studyjiosData.items;
return ListView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: studyjios.length,
itemBuilder: (ctx, i) => ChangeNotifierProvider(
create: (ctx) => studyjios[i],
child: StudyjioItem(),
),
);
},
}
Если вы хотите использовать Provider.of<Studyjios>()
или Consumer<Studyjios>
(виджет, который будет отслеживать изменения в Studyjios
) где-нибудь еще в вашем приложении, тогда вы можете поместить ChangeNotifierProvider<Studyjios>
выше в дереве виджетов, чтобы оба места могли использовать одного и того же поставщика
В моем случае я использую MultiProvider
в самом верху своего дерева и использую поставщиков для широких функций приложения, таких как Api
и Database
сервисы и ChangeNotifierProvider
, чтобы легко переключаться между светлыми и темными темами . Таким образом, вы можете быть уверены, что, когда вам понадобятся поставщики, они будут доступны, вам не нужно помещать их наверху дерева, это всего лишь пример:
Widget build(BuildContext context) {
return MultiProviders(
providers: [
Provider(create: (_) => DataBase()),
Provider(create: (_) => Api()),
ChangeNotifierProvider(create: (_) => Theme()),
],
child: Consumer<Theme>(
builder: (context, theme, _) => MaterialApp(
title: 'My app',
theme: theme.light,
darkTheme: theme.dark,
themeMode: theme.mode ?? ThemeMode.light,
...
),
),
);
}