Постоянный вход в систему с использованием Firebase currentUser не работает - приложение Flutter - PullRequest
0 голосов
/ 06 марта 2020

Моя цель для этого приложения - иметь постоянный вход в систему, так что пользователь моего приложения Flutter должен входить в систему только один раз (если он не вышел), и всякий раз, когда мое приложение Flutter перезапускается, ему не нужно повторно входить в систему. Я видел много примеров использования Firebase Authentication и метода .currentUser (), но мне все равно приходится входить в систему каждый раз, когда я перезапускаю приложение. Я проверил это на симуляторе (ios) и на моем физическом iphone во время работы в режиме отладки на xCode (USB-соединение). Возможно ли, что я не могу проверить эту функциональность таким образом? Потому что я вижу всплывающее сообщение на терминалах android studio и xCode, в которых упоминается потеря подключения к устройству или прекращение работы из-за перезапуска. Если это так, как я могу проверить, что постоянный вход в систему работает?

Если это не так, что я делаю не так? Я включил код ниже. Конечно, это происходит в виджете с состоянием.

final _auth = FirebaseAuth.instance;

checkIfCurrentUserExists() async {
  try {
    await _auth.currentUser().then((user) {
      print('this is the user $user');
      if (user != null && user.email != null) {
        userIsLoggedIn = true;
        // this works fine!
      }
    });
  } catch (e) {
   print('current user was not found $e');
   // this works fine!
  }
}

// called inside initState() 
setClientOnLoad() async {
  await Spryte.checkIfCurrentUserExists();
  var doesCurrentUserExist = userIsLoggedIn;
  var currentUser = await returnCurrentUser();
  if (doesCurrentUserExist == false) {
    //if user is not authenticated, set anonymous user
    // this works fine!
  } 
  else {
    //print('current user does exist');
    await foo(currentUser.uid);
    // 'foo' is meant to retrieve some data about the client on loading of the app
    // so that the user doesn't have to log in every time the app restarts
    // but for some reason it's not working for me
  }
}

1 Ответ

1 голос
/ 06 марта 2020

Вы звоните setClientOnLoad(), который является asyn c внутри init(), метод и другие навигационные приложения зависят от этого метода, поэтому вам нужно обернуть все ваши асин c вещи в FutureBuilder(). если нет, то метод build() будет вызван до полного выполнения setClientOnLoad(), например: -

FutureBuilder(
  future: setClientOnLoad(),
  builder: (context, AsyncSnapshot<R> snapshot) {
    if (snapshot.data == null) {
      return Center(child: CircularProgressIndicator());
    }
    // after executing method completely
  },
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...