Провайдер не найден в анчесторе - PullRequest
0 голосов
/ 11 марта 2020

Вот у меня проблема с другим провайдером. У меня есть главный виджет, который переключает основной вид, этот виджет называется switcher.dart

. Я инициализирую провайдера внутри мультипровера в th switch и использую его в загруженном представлении (mainPage.dart). Представление дало мне ошибку. Поставщик не найден.

switcher.dart

 import '../providers/mainPageProvider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/userProvider.dart';
import 'package:flutter/widgets.dart';
import '../widgets/login.dart';
import '../widgets/mainPage.dart';
import '../widgets/splash.dart';

class Switcher extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProxyProvider<UserProvider, MainPageProvider>(
          create: (context) => MainPageProvider.init(
              Provider.of<UserProvider>(context, listen: false)),
          update: (context, userProvider, mainPageProvider) =>
              mainPageProvider..update(userProvider),
        ),
      ],
      child: Consumer<UserProvider>(
        builder: (context, user, _) {
          print('switcher notifyed');
          print(user.status);
          switch (user.status) {
            case UserStatus.Uninitialized:
              return Splash();
              break;
            case UserStatus.Authenticated:
              return MainPage();
              break;
            case UserStatus.Unauthenticated:
              return Login();
              break;
            case UserStatus.Authenticating:
              return Login();
              break;
            case UserStatus.Checking:
              return Splash();
              break;
            default:
              return Splash();
          }
        },
      ),
    );
  }
}

в представлении mainPage. Я использую простого потребителя MainPageProvider, но говорит:

The following ProviderNotFoundError was thrown building Consumer<MainPageProvider>(dirty):
Error: Could not find the correct Provider<MainPageProvider> above this Consumer<MainPageProvider> Widget

To fix, please:

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

view Потребительский пример в этом случае mainPage.dart

import 'package:client/providers/mainPageProvider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:provider/provider.dart';
import '../widgets/smallCard.dart';
import 'contoCard.dart';

class MainPage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: SingleChildScrollView(
          child:  Container(
                        height: 100,
                        margin: EdgeInsets.only(left: 10),
                        child: Consumer<MainPageProvider>(
                          builder: (context, mainPageProvider, _) {
                            if(mainPageProvider.conti == null){
                                  return SpinKitPulse(
                                    color: Theme.of(context).primaryColor,
                                  );
                            }else if(mainPageProvider.conti.length ==0){
                          return Text(
                        'Ancora nessun conto',
                        style: TextStyle(fontFamily: "sofiapro", fontSize: 14),
                      );
                            }else{
                              return ListView.builder(
                                    scrollDirection: Axis.horizontal,
                                    itemCount: mainPageProvider.conti.length,
                                    itemBuilder: (BuildContext context, index) {
                                      var conti = mainPageProvider.conti;
                                      var conto = conti[index];
                                      return ContoCard(conto);
                                    },
                                  );
                            }

                          },
                        ),
                      ),
                    .......

Переключатель кажется мне предком, потому что представление загружается как дочерний, я попытался изменить способ импорта с импорта '.. /providers/mainPageProvider.dart '; импортировать «пакет: клиент / провайдеры / mainPageProvider.dart»; но ошибка все еще была.

Любая помощь приветствуется

...