You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中DrawerNavigation找不到正确Provider<AuthBlock>如何解决?

你遇到的报错核心原因是:你在DrawerNavigation组件中通过Provider.of<AuthBlock>(context)获取AuthBlock实例时,Flutter在当前组件的上层Widget树中,找不到你提前注册的Provider<AuthBlock>实例。Provider要求你必须在需要访问实例的组件的上层节点,提前完成实例的注册挂载,否则无法向下传递。

步骤1:修改根App组件完成AuthBlock注册

打开你项目中的lib/src/app.dart文件,将根组件用Provider包裹,注册AuthBlock实例,参考代码如下:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:to_do_list/blocks/auth_block.dart';
import 'package:to_do_list/screens/home_screen.dart';

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 如果你不需要监听AuthBlock的状态变化,直接使用Provider即可
    return Provider<AuthBlock>(
      create: (context) => AuthBlock(),
      child: MaterialApp(
        title: '待办清单',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: HomeScreen(),
      ),
    );
    // 如果你后续需要监听登录状态变化,就把上面的Provider换成ChangeNotifierProvider,同时给AuthBlock加ChangeNotifier混入
    /*
    return ChangeNotifierProvider(
      create: (context) => AuthBlock(),
      child: MaterialApp(
        title: '待办清单',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: HomeScreen(),
      ),
    );
    */
  }
}

步骤2:(可选)适配状态监听需求

如果你后续需要根据登录状态动态更新UI,给AuthBlock加上ChangeNotifier混入,修改后的AuthBlock代码如下:

import 'package:flutter/foundation.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:to_do_list/service/auth_service.dart';

class AuthBlock with ChangeNotifier {
  final authService = AuthService();
  final googleSignIn = GoogleSignIn(scopes: ['email']);

  Stream<User> get currentUser => authService.currentUser;

  loginWithGoogle() async {
    try {
      final GoogleSignInAccount googleUser = await googleSignIn.signIn();
      final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
      final AuthCredential credential = GoogleAuthProvider.credential(
        idToken: googleAuth.idToken,
        accessToken: googleAuth.accessToken,
      );
      final result = await authService.signInWithCredential(credential);
      print('登录用户:${result.user.displayName}');
      // 通知所有监听者状态更新
      notifyListeners();
    } catch (error) {
      print('登录报错:$error');
    }
  }

  logout() {
    authService.logout();
    notifyListeners();
  }
}

步骤3:全量重启应用

修改完成后,停止当前运行的应用,重新启动,不要使用热重载,避免上下文未刷新导致报错仍然存在。

内容的提问来源于stack exchange,提问作者QuickAccount

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 14:42:03