首页 > 解决方案 > 在 anchestor 中找不到提供程序

问题描述

在这里,我遇到了另一个提供商问题。我有一个切换主视图的主小部件,这个小部件称为 switcher.dart

我将 multiprovider 中的提供程序初始化到切换器中,并在加载的视图中使用它(mainPage.dart)。该视图给了我错误 Provider not found 。

切换器.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

查看本案例中的消费者示例 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);
                                    },
                                  );
                            }

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

切换器对我来说似乎是一个锚,因为视图是作为一个孩子加载的,我试图从 import '../providers/mainPageProvider.dart'; 更改导入方式;导入'package:client/providers/mainPageProvider.dart';但错误仍然存​​在。

任何帮助表示赞赏

标签: flutterflutter-provider

解决方案


推荐阅读