- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
=2.16.2 createState() => _MyAppState(); final GlobalKey navigatorKey = GlobalKey()-6ren">
所以,我开始用 sdk: ">=2.16.2 <3.0.0"和 Firebase Integration 做一个 Flutter App。我在 main.dart 上有以下代码用于“authStateChanges()”:
if (snapshot.connectionState == ConnectionState.done) {
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
Navigator.of(context).pushReplacementNamed('login');
} else {
Navigator.of(context).pushReplacementNamed('home');
}
});
}
它在第一次加载应用程序时起作用,但如果用户登录(或注销),则会在 Navigator 上出现“未处理的异常:空值检查运算符”。
这是完整的 main.dart 代码:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:pollux_android/src/pages/error_page.dart';
import 'package:pollux_android/src/pages/loading_page.dart';
import 'package:pollux_android/src/routes/routes.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
}
class _MyAppState extends State<MyApp> {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
routes: polluxRoutes,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: mainScreen(),
);
}
mainScreen() {
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
if (snapshot.hasError) {
return const ErrorPage(
errorMessage: 'Unknown error',
);
}
if (snapshot.connectionState == ConnectionState.done) {
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
Navigator.of(context).pushReplacementNamed('login');
} else {
Navigator.of(context).pushReplacementNamed('home');
}
});
}
return const LoadingPage();
},
);
}
}
我不明白为什么在 authStateChanges() 上第二次导航失败。感谢您提供的帮助。我相信这与新版本的 Null 检查有关,因为这个问题在 sdk 2.7.0 上没有发生
最佳答案
由于某种原因,当 authStateChanges() 发生时上下文变为空。感谢@Saitoh-Akira,我想到了使用 navigator Key 并使用它在没有上下文的情况下进行导航。如果我理解正确的话,Navigator 需要一个状态。无论如何,添加导航键并使用它效果很好:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:pollux_android/src/pages/error_page.dart';
import 'package:pollux_android/src/pages/loading_page.dart';
import 'package:pollux_android/src/routes/routes.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
// final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
}
class _MyAppState extends State<MyApp> {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
routes: polluxRoutes,
navigatorKey: navigatorKey,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: mainScreen(),
);
}
mainScreen() {
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
if (snapshot.hasError) {
return const ErrorPage(
errorMessage: 'Some unknown error happened',
);
}
if (snapshot.connectionState == ConnectionState.done) {
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
navigatorKey.currentState?.pushNamedAndRemoveUntil('login', (route) => false);
} else {
navigatorKey.currentState?.pushNamedAndRemoveUntil('home', (route) => false);
}
});
}
return const LoadingPage();
},
);
}
}
关于firebase - Flutter Navigator.of(context).pushReplacementNamed 在 main.dart 上抛出 :"Unhandled Exception: Null check operator used on a null value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72342042/
我正在学习这个关于 flutter 的 udemy 类(class)(https://www.udemy.com/learn-flutter-dart-to-build-ios-android-app
我正在尝试使用 Navigator.pushReplacementNamed() 在路由之间传递值,但我没有得到它。 我无法弄清楚数据将退出 pushReplacementNamed 并获取 rout
NavigatorState类(class) Flutter#navigator.dart有2个具有类似行为的方法。 pushReplacementNamed有什么区别和 popAndPushName
所以,我开始用 sdk: ">=2.16.2 createState() => _MyAppState(); final GlobalKey navigatorKey = GlobalKey()
我是一名优秀的程序员,十分优秀!