Future Builder не работает при возврате в виджет - PullRequest
1 голос
/ 02 мая 2020

Я использую FutureBuilder с аутентификацией Firebase. я ожидаю, что флаттер проверит внутри FutureBuilder на статус входа пользователя. если пользователь вошел в виджет для отображения должен быть значок logout. если пользователь вышел из системы, то отображаемый виджет должен иметь вид login

Моя функция для Future выглядит следующим образом:

Future<String> setUserStatus()

async {

userStatus = await FirebaseAuth.instance.currentUser();


uid = userStatus.uid;

print('after the query - The user is $uid after');

if(uid == null){

  return uid = null;

} else if( uid != null){

  return uid = userStatus.uid;
}

}

My Future Builder выглядит следующим образом:

FutureBuilder<String>(

future: future_user, 
builder: (BuildContext context,  snapshot) {

  String update_status = snapshot.data;

if(update_status == null){
return //Widget for login
}

else if(update_status != null){
return //widget for logout
}

Это прекрасно работает, если я нажимаю кнопку выхода из системы. Виджет обновляется правильно и дает пользователю возможность войти в систему. Функция для выхода из системы:

Future<String> logout() async {
await FirebaseAuth.instance.signOut();
setState(() {
  future_user = setUserStatus();
});

}

Проблема заключается в том, что при входе в систему пользователь попадает на отдельную страницу входа. После входа в систему, когда я возвращаюсь на главную страницу, где работает FutureBuider, он не получает uid пользователя (возвращает ноль) и по-прежнему показывает значок login. я вызываю Future Builder внутри initState, поэтому он не должен запускаться при переходе назад?

Future<String> future_user;

@override
void initState() {
super.initState();
setState(() {
  future_user = setUserStatus();

});

}

при повторном запуске приложения из Android Studio оно корректно обновляет виджет.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

initstate не будет вызываться при переходе назад с любого другого экрана, поскольку вы столкнулись с этой проблемой.

Вы можете вызвать SetState, когда вернулись с экрана входа в систему следующим образом.

 Navigator.push(context, MaterialPageRoute(builder: (_) => 
    Demo2())).then((value) => {
      setState(() {
           future_user = setUserStatus();
        });
    });

Я не знаю, как меняется ваш пользовательский статус, поэтому я просто продемонстрировал, как вы можете вызывать какой-либо метод или что вы хотите сделать, когда вы вернулись с экрана входа в систему, чтобы вы могли получить новые данные.

0 голосов
/ 02 мая 2020

Вы можете использовать метод вызова ниже при нажатии кнопки входа в систему, как показано ниже ..

_navigateAndDisplaySelection(BuildContext context) async {
  final result = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => LoginScreen()),
  );

  // After the Selection Screen returns a result, hide any previous snackbars
  // and show the new result.
     setState(() {
  future_user = result;

});
}

И, пожалуйста, используйте WillPopScope Виджет на странице входа в систему, и поэтому, когда вы нажимаете на страницу входа, то после успешного входа в систему он напрямую перенаправляется на главную страницу.

Используйте Navigator.pop(context,_loggedInStatus); в кнопке входа OnPressed event

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...