flutter - 如何使用 firebase_auth 和 provider 检测身份验证更改
问题描述
我的Auth
提供者类中有这个简单的登录方法
Future login(String email, String password) async {
try {
AuthResult result = await _firebaseAuth.signInWithEmailAndPassword(
email: email, password: password);
FirebaseUser user = result.user;
var _tokenServer = await user.getIdToken();
_token = _tokenServer.token;
_userId = user.uid;
notifyListeners();
print("logged in");
return user.uid;
} catch (e) {
print(e);
}
}
}
这个吸气剂
bool get isAuth {
return _token != null;
}
这是我的主要
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider.value(
value: Auth(),
),
],
child: Consumer<Auth>(
builder: (ctx, auth, _) => MaterialApp(
title: 'Flutter Demo',
// theme: ThemeData(
// // primarySwatch: Colors.blue,
// ),
theme: ThemeData.dark(),
home: auth.isAuth ? HomeScreen() : LoginScreen(),
),
),
);
}
如果我登录,我可以获得所有数据(令牌、ID 等),但页面不会改变,我会停留在登录页面。我究竟做错了什么?
编辑:我现在看到我可以重定向到主屏幕,但我需要按后退按钮才能进入主屏幕
解决方案
实际上,您不会将整个应用程序包装在Consumer
. 该home
属性不会刷新以更改主要路线。你可以改为这样做。
例子:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider.value(
value: Auth(),
),
],
child: MaterialApp(
title: 'Flutter Demo',
// theme: ThemeData(
// // primarySwatch: Colors.blue,
// ),
theme: ThemeData.dark(),
home: Consumer<Auth>(
builder: (ctx, auth, _) {
return auth.isAuth ? HomeScreen() : LoginScreen();
},
),
),
);
}
}
希望有帮助!
推荐阅读
- amazon-web-services - JupyterHub proxy-public svc 没有外部 IP(卡在
) - c# - 没有 for 或 foreach 的 LINQ 反射
- c++ - 由于二进制文字是在 c++14 中引入的..但它可以在 C++98/C++03/C++11 中使用
- javascript - 将 JSON 数组拆分为 JS 变量 - Bixby
- java - Spring @RestController 如何在类级别获取标题
- swift - 编译时的 Swift 编译器错误
- python - 为什么python说一个字符串与另一个字符串不匹配
- python - 防止 Python 检查条件不满足的 if 语句中的语法错误
- mongodb - 使用在spring mongo数据中存储为字符串的日期查询
- traccar - 如何在traccar中将数据从服务器发送到设备?