Flutter实现Microsoft Azure登录时navigatorKey报错的解决方法
错误原因分析
你遇到的错误提示NavigatorState returned from provided navigatorKey is null,本质是两个核心问题:
- 未将定义的
navigatorKey传递给MaterialApp/CupertinoApp/WidgetApp的navigatorKey参数 - 在
WidgetApp还未挂载到Flutter Widget树时,就初始化了AadOAuth,导致navigatorKey尚未关联到有效的NavigatorState
正确使用步骤
全局定义navigatorKey
确保navigatorKey是全局可访问的,比如在项目主文件中定义:final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();将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(), ); } }延迟初始化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
相关产品推荐
相关产品推荐

