FCM не будет обновлять состояние провайдера? - PullRequest
0 голосов
/ 14 февраля 2020

пожалуйста, мне нужна ваша помощь в этом случае, в настоящее время я использую следующее в главном файле для перехода к нескольким точкам входа на основе состояний авторизации

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();
          }
        },
      ),

В классе запуска «Proxy 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 Messaging на домашней странице и реагирую на сообщение, полученное из облачных сообщений 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();
    });
  }
}

Проблема заключается в : когда я pu sh сообщение для клиента, клиент успешно получает сообщение, но когда я закрываю диалоговое окно, showLockedAccountAlert предоставляет Provider.of (context, слушать: ложь) .reAuthenticate (); он запускается, но не обновляет статус до Status.Unauthenticated, например, и не уведомляет слушателей по какой-то причине.

Я не вижу ошибок в журналах,

...