【问题标题】:Error: Could not find the correct Provider<SignInProvider> above this MyApp Widget错误:在此 MyApp 小部件上方找不到正确的 Provider<SignInProvider>
【发布时间】:2024-01-21 10:12:01
【问题描述】:

我正在尝试在 MaterialApp 中将 StreamProvider 与 MultiProvider 一起使用

当我尝试访问提供程序时,我收到以下错误:

错误:在此 MyApp 小部件上方找不到正确的提供程序

main.dart

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    final provider = Provider.of<SignInProvider>(context, listen: false);
    return MultiProvider(
      providers: [
        StreamProvider<UserModel>.value(value: provider.authStateChange())
      ],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primaryColor: primaryColor,
          accentColor: secondaryColor,
          textTheme: customTextTheme
        ),
        home: AuthHandler()
      ),
    );
  }
}

class AuthHandler extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    UserModel _userModel = Provider.of<UserModel>(context);
    return (_userModel != null) ? HomeScreen() : LoginScreen();
  }
}

user_model.dart

class UserModel {
  String uid;
  String displayName;
  String photoURL;
  String email;

  UserModel({ this.uid, this.displayName, this.photoURL, this.email, });
}

signin_provider.dart

Stream<UserModel> authStateChange() {
    return firebaseAuth.authStateChanges().map((User user) => (user != null) ? UserModel(uid: user.uid) : null);
  }

【问题讨论】:

    标签: flutter dart flutter-provider flutter-state


    【解决方案1】:

    转到 main.dart 并添加您的Provider


    例子:

    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      const MyApp({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return ChangeNotifierProvider<ThemeBloc>(
          create: (_) => ThemeBloc(),
          child: Consumer<ThemeBloc>(
            builder: (_, mode, child) {
              return MultiProvider(
                providers: [
                  ChangeNotifierProvider<SignInBloc>(
                    create: (context) => SignInBloc(),
                  ),
                  ChangeNotifierProvider<NewsDataBloc>(
                    create: (context) => NewsDataBloc(),
                  ),
                  ChangeNotifierProvider<PopularDataBloc>(
                    create: (context) => PopularDataBloc(),
                  ),
               
              
                ],
                child: MaterialApp(
               
                    home: MyHomePage()),
              );
            },
          ),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      const MyHomePage({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
      
          return WelcomePage();
       
      }
    }
    

    【讨论】:

      最近更新 更多