错误:无法在此AuthenticationWrapper Widget之上找到正确的提供程序
这是因为您使用了不包括您选择的提供者的BuildContext。有几种常见的情况:
main.dart中添加了一个新的提供程序,并执行了热重加载。若要修复,请执行热重新启动.。
您要读取的提供程序
提供者被“限定范围”。因此,如果在路由中插入提供程序,则其他路由将无法访问该提供程序。
BuildContext,它是您要读取的提供程序的祖先。确保AuthenticationWrapper位于您的多提供者/提供程序之下。这通常发生在您创建一个提供程序并试图立即读取它()时。
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:park_app/app_styles.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import './views/pages.dart';
import 'views/authentication/authentication_service.dart';
import 'Home_Page.dart';
bool? seenOnboard;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
// to show status bar
SystemChrome.setEnabledSystemUIOverlays(
[SystemUiOverlay.bottom, SystemUiOverlay.top]);
// to load onboard for the first time only
SharedPreferences pref = await SharedPreferences.getInstance();
seenOnboard = pref.getBool('seenOnboard') ?? false; //if null set to false
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
Provider<AuthenticationService>(
create: (_) => AuthenticationService(FirebaseAuth.instance),
),
StreamProvider(
initialData: null,
create: (context) =>
context.read<AuthenticationService>().authStateChanges),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Park App',
theme: ThemeData(
textTheme: GoogleFonts.manropeTextTheme(
Theme.of(context).textTheme,
),
primarySwatch: Colors.blue,
scaffoldBackgroundColor: kScaffoldBackground,
),
home: seenOnboard == true ? AuthenticationWrapper() : OnBoardingPage(),
),
);
}
}
class AuthenticationWrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final firebaseUser = context.watch<User>();
if (firebaseUser != null) {
return HomePage();
}
return LoginPage();
}
}发布于 2021-12-24 11:59:59
确保在StreamProvider上指定泛型类型
StreamProvider<User?>(
...
)请注意,您已经将null设置为initialData,因此您的小部件可能需要处理null用户。意思是你需要做:
final user = context.watch<User?>()发布于 2022-06-19 23:43:26
通过运行以下命令来安装提供程序:
flutter pub add provider,然后在main.dart文件中导入import 'package:provider/provider.dart';
https://stackoverflow.com/questions/70472551
复制相似问题