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

Flutter实现Microsoft Azure登录时navigatorKey报错的解决方法

解决Flutter中Azure登录navigatorKey为空的问题

错误原因分析

你遇到的错误提示NavigatorState returned from provided navigatorKey is null,本质是两个核心问题:

  • 未将定义的navigatorKey传递给MaterialApp/CupertinoApp/WidgetApp的navigatorKey参数
  • 在WidgetApp还未挂载到Flutter Widget树时,就初始化了AadOAuth,导致navigatorKey尚未关联到有效的NavigatorState

正确使用步骤

  1. 全局定义navigatorKey
    确保navigatorKey是全局可访问的,比如在项目主文件中定义:

    final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
    
  2. 将navigatorKey绑定到根WidgetApp
    在你的根MaterialApp(或CupertinoApp)中,必须传入这个navigatorKey:

    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          navigatorKey: navigatorKey, // 关键:此处必须绑定
          title: 'Azure Login Demo',
          home: const LoginPage(),
        );
      }
    }
    
  3. 延迟初始化AadOAuth
    不要在全局作用域提前初始化AadOAuth,而是等到WidgetApp已经挂载后再初始化,比如在StatefulWidget的initState方法中:

    class LoginPage extends StatefulWidget {
      const LoginPage({super.key});
    
      @override
      State<LoginPage> createState() => _LoginPageState();
    }
    
    class _LoginPageState extends State<LoginPage> {
      late AadOAuth _microsoftSignIn;
    
      @override
      void initState() {
        super.initState();
        // 此时WidgetApp已在Widget树中,navigatorKey已关联有效状态
        _microsoftSignIn = AadOAuth(Config(
          tenant: "***********6b6f47",
          clientId: "**********7fcae6",
          responseType: "code",
          scope: "User.Read",
          redirectUri: "msalee***********46f7fcae6://auth",
          loader: const Center(child: CircularProgressIndicator()),
          navigatorKey: navigatorKey,
        ));
      }
    
      // 登录方法示例
      Future<void> _signIn() async {
        try {
          await _microsoftSignIn.login();
          // 登录成功后的逻辑
        } catch (e) {
          // 处理错误
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: ElevatedButton(
              onPressed: _signIn,
              child: const Text('微软登录'),
            ),
          ),
        );
      }
    }
    

关键注意点

  • 禁止在全局作用域直接初始化AadOAuth,因为此时navigatorKey还未和MaterialApp绑定,会返回null的NavigatorState
  • 确保navigatorKey的实例唯一,不要重复创建多个GlobalKey实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:17:44