在这种情况下,请您提供帮助,目前,我正在主文件上使用以下内容导航到基于身份验证状态的多个入口点
main.dart
FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
return MultiProvider(
providers: [
ChangeNotifierProvider<Locations>(
builder: (ctx) => M1(),
),
ChangeNotifierProvider<Users>(
builder: (ctx) => M2(),
),
ChangeNotifierProxyProvider2<M1, M2, Startup>(
builder: (context, m1, m2, startup) =>
Initializer.instance(m1, m2, _firebaseMessaging),
initialBuilder: (context) =>
Initializer.instance(null, null, null),
),
],
child: Consumer<startup>(
builder: (ctx, startup, _) => MaterialApp(
home: Builder(
builder: (context) {
switch (auth.status) {
case Status.Unauthenticated:
return AuthenticationPage();
case Status.Authenticated:
return HomePage();
default:
return AuthenticationPage();
}
},
),
在启动类“ Provider Proxy”上,我有以下维护身份验证状态和更新用户数据库中FCM的令牌的方法
Startup.dart
class Startup with ChangeNotifier {
final M1 m1;
final M2 m2;
FirebaseMessaging _firebaseMessaging;
StreamSubscription userAuthSub;
Startup.instance(
this.m2, this.m1, this._firebaseMessaging)
: _firebaseAuth = FirebaseAuth.instance {
if (this.m1 != null && this.m2 != null) {
userAuthSub =
_firebaseAuth.onAuthStateChanged.listen(_onAuthStateChanged);
}
// This is just an example of how _onAuthStateChanged reacts with status and notify listeners after the reload operation
Future<void> _onAuthStateChanged(FirebaseUser firebaseUser) async {
if (firebaseUser == null) {
_status = Status.Unauthenticated;
notifyListeners();
}
Future<bool> reAuthenticate() async {
FirebaseUser user = await _firebaseAuth.currentUser();
await user.reload();
}
}
我正在主页上配置firebase消息传递,并在从Firebase云消息传递中收到消息时做出反应,基本上它所做的是通过调用启动提供程序和_onAuthStateChanged中的函数来重新加载用户身份验证,以检查用户是否已禁用如下所述在必要时更新状态
HomePage.dart
@override
void didChangeDependencies() {
if (!_loading) {
FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
onMessageAlert(message);
}
);
}
Future<void> onMessageAlert(message) async {
await showLockedAccountAlert().then((_) {
Provider.of<Startup>(context, listen: false).reAuthenticate();
});
}
}
问题是:当我向客户端推送消息时,客户端成功获取了该消息,但是当我关闭对话框showLockedAccountAlert对话框时,Provider.of(context,listen:false).reAuthenticate( );它可以运行,但是不会将状态更新为Status.Unauthenticated,例如,由于某种原因也不会通知监听器。
我在日志上看不到任何错误,