Ошибка: не удалось найти правильный поставщик ‹UsersProvider› над этим виджетом AdminDashboardPage

  • Это мой admin_dashboardpage.dart
  • Я нажимаю кнопку, и открывается эта страница
  • Я делаю это приложение, в котором получаю данные из хранилища пожаров. Я не могу пройти через это, как только я нажимаю на админдашборд, я получаю сообщение об ошибке, упомянутое после кода.
import 'package:flutterapp/admin_ui/user_disable_page.dart';
import 'package:flutterapp/admin_ui/user_enable_page.dart';

import 'package:flutterapp/admin_ui/shadow_container.dart';
import 'package:flutterapp/admin_ui/admin_user.dart';
import 'package:flutterapp/providers/users_provider.dart';

import 'package:flutter/material.dart';
import 'package:flutterapp/database/Admin.dart';
import 'package:provider/provider.dart';

import 'package:flutterapp/admin_ui/page_header.dart';

class AdminDashboardPage extends StatefulWidget {
  AdminDashboardPage({Key key}) : super(key: key);

  @override
  _AdminDashboardPageState createState() => _AdminDashboardPageState();
}

class _AdminDashboardPageState extends State<AdminDashboardPage> {
  @override
  Widget build(BuildContext context) {
    final usersProvider = Provider.of<UsersProvider>(context);
    return Scaffold(
      body: ListView(
        children: <Widget>[
          PageHeader(
            title: 'Users Dashboard',
          ),
          for (int i = 0; i < usersProvider.users.length; i++)
            AdminUserItem(
              adminuser: usersProvider.users[i],
            ),
        ],
      ),
      floatingActionButton: Container(
        margin: EdgeInsets.only(bottom: 10),
        child: FloatingActionButton.extended(
            onPressed: () {
              Navigator.of(context).push(
                new MaterialPageRoute<Null>(
                    builder: (BuildContext context) {
                      return Admin();
                    },
                    fullscreenDialog: true),
              );
            },
            icon: Icon(
              Icons.add,
            ),
            label: Text("Create Admin")),
      ),
    );
  }
}

class AdminUserItem extends StatelessWidget {
  final AdminUser adminuser;
  const AdminUserItem({
    this.adminuser,
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ShadowContainer(
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(adminuser.name),
                  SizedBox(height: 3),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Text(adminuser.email),
                    ],
                  ),
                ],
              ),
              Column(
                children: <Widget>[
                  SizedBox(height: 8),
                  InkWell(
                    onTap: () {
                      Navigator.of(context).push(
                        new MaterialPageRoute<Null>(
                            builder: (BuildContext context) {
                              return UserDisablePage(
                                user: adminuser,
                              );
                            },
                            fullscreenDialog: true),
                      );
                    },
                    child: Container(
                      padding: EdgeInsets.symmetric(horizontal: 10, vertical: 6),
                      decoration:
                      BoxDecoration(border: Border.all(color: Theme.of(context).buttonColor), borderRadius: BorderRadius.circular(20)),
                      child: Text(
                        'Disable Account',
                        style: TextStyle(fontSize: 12, color: Theme.of(context).buttonColor),
                      ),
                    ),
                  ),
                  SizedBox(height: 8),
                  InkWell(
                    onTap: () {
                      Navigator.of(context).push(
                        new MaterialPageRoute<Null>(
                            builder: (BuildContext context) {
                              return UserEnablePage(
                                user: adminuser,
                              );
                            },
                            fullscreenDialog: true),
                      );
                    },
                    child: Container(
                      padding: EdgeInsets.symmetric(horizontal: 10, vertical: 6),
                      decoration:
                      BoxDecoration(border: Border.all(color: Theme.of(context).buttonColor), borderRadius: BorderRadius.circular(20)),
                      child: Text(
                        'Enable Account',
                        style: TextStyle(fontSize: 12, color: Theme.of(context).buttonColor),
                      ),
                    ),
                  ),
                ],
              ),
            ],
          ),
        ],
      ),
    );
  }
}
  • Другой файл с именем users_provider.dart
import 'package:flutter/material.dart';

import 'package:flutterapp/admin_ui/admin_user.dart';
import 'package:flutterapp/services/users_services.dart';

class UsersProvider with ChangeNotifier {
  bool _isLoading = false;
  bool get isLoading => _isLoading;

/* ------------------------------- NOTE Users ------------------------------- */
  List<AdminUser> _users = [];
  List<AdminUser> get users => _users;

  Future initState() async {
    var res = await UsersService.streamUsers();
    res.listen((r) {
      _users = r;
      notifyListeners();
    });
  }

  Future disableUser({AdminUser user}) async {
    await UsersService.disableUser(user: user);
  }

  Future enableUser({AdminUser user}) async {
    await UsersService.enableUser(user: user);
  }
}
  • Ошибка, с которой я столкнулся
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following ProviderNotFoundError was thrown building AdminDashboardPage(dirty, state: _AdminDashboardPageState#713d8):
Error: Could not find the correct Provider<UsersProvider> above this AdminDashboardPage Widget

To fix, please:

  * Ensure the Provider<UsersProvider> is an ancestor to this AdminDashboardPage Widget
  * Provide types to Provider<UsersProvider>
  * Provide types to Consumer<UsersProvider>
  * Provide types to Provider.of<UsersProvider>()
  * Always use package imports. Ex: `import 'package:my_app/my_code.dart';
  * Ensure the correct `context` is being used.

If none of these solutions work, please file a bug at:
https://github.com/rrousselGit/provider/issues

The relevant error-causing widget was: 
  AdminDashboardPage file:///home/cerelabs/AndroidStudioProjects/flutterapp/flutterapp/lib/ui/home.dart:50:70
When the exception was thrown, this was the stack: 
#0      Provider.of (package:provider/src/provider.dart:264:7)
#1      _AdminDashboardPageState.build (package:flutterapp/admin_ui/admin_dashboardpage.dart:24:36)
#2      StatefulElement.build (package:flutter/src/widgets/framework.dart:4619:28)
#3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15)
#4      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

- Это структура файлов. введите здесь описание изображения


person Lav Sharma    schedule 24.05.2020    source источник


Ответы (1)


Сначала вам необходимо зарегистрировать Провайдера. Это можно сделать в любом месте наверху (в дереве виджетов), где вы хотите использовать Provider.

Например, если ваш провайдер требуется практически повсюду в приложении, рекомендуется зарегистрировать его в файле main.dart. Если вы хотите зарегистрировать несколько провайдеров, вы можете использовать MultiProvider

Фрагмент из моего файла main.dart:

    class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          builder: (_) => Galleries(),
        ),
        ChangeNotifierProvider(
          builder: (_) => Fotos(),
        ),
      ],
      child: MaterialApp(
person Benedikt J Schlegel    schedule 24.05.2020