Ошибка: не удалось найти правильный поставщик <Studyjios>над этим виджетом StudyjiosList - PullRequest
0 голосов
/ 17 июня 2020

изображение ошибки Я получаю сообщение об ошибке: Не удалось найти правильный Provider<Studyjios> над этим StudyjiosList виджетом при попытке запустить приложение в VSCode.

Исправить Пожалуйста:

  • Убедитесь, что Provider<Studyjios> является предком этого StudyjiosList Widget
  • Укажите типы для Provider<Studyjios>
  • Укажите типы для Consumer<Studyjios>
  • Укажите типы для Provider.of<Studyjios>()
  • Всегда используйте импорт пакетов. Пример: import 'package:my_app/my_code.dart';
  • Убедитесь, что используется правильный context.
    class StudyjiosList extends StatelessWidget {
      final bool showMine;
      final bool showJoined;

      StudyjiosList(this.showMine, this.showJoined);

      @override
      Widget build(BuildContext 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(),
          ),
        );
      }
    }
    class Studyjios with ChangeNotifier {
      List<Studyjio> _items = [
        Studyjio(
          id: 's1',
          title: 'CS2040S Finals Revision',
          description: 'We will be going through past year final papers from 2014 to 2018.',
          isOffline: true,
          modules: ['CS2040S'],
          date: DateTime.now(),
          startTime: '2.00pm',
          endTime: '4.00pm',
          capacity: 5,
          bookRoom: true,
          location: 'COM1-0206',
          currentCount: 3,
        ),
        Studyjio(
          id: 's2',
          title: 'CS2030 Practical Exam Timed Practice',
          description: 'We will be doing timed practices for 2017 and 2018 PE papers.',
          isOffline: false, // online session
          modules: ['CS2030'],
          date: DateTime.now(),
          startTime: '1.00pm',
          endTime: '3.00pm',
          capacity: 10,
          bookRoom: false,
          currentCount: 5,
        )
      ]

      List<Studyjio> get items {
        return [..._items];
      }

      List<Studyjio> get myStudyjios {
        return _items.where((studyjioItem) => studyjioItem.isMine).toList();
      }

      Studyjio findbyId(String id) {
        return _items.firstWhere((studyjio) => studyjio.id == id);
      }

ps. "studyjio" означает "учебная сессия"

1 Ответ

0 голосов
/ 18 июня 2020

Таким образом, похоже, что вы не создали поставщика для 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,
          ...
        ),
      ),
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...