FutureBuilder в приложении создания флаттера снова и снова? - PullRequest
0 голосов
/ 17 января 2020

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

@override
Widget build(BuildContext context) {
return MultiProvider(
  providers: [
    ChangeNotifierProvider.value(
      value: Auth(),
    )
  ],
  child: Consumer<Auth>(
    builder: (ctx, auth, _) {
      print('making it again and again');
      return MaterialApp(
          title: 'MY app',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            accentColor: Colors.deepOrange,
          ),
          home: auth.isAuth
              ? FirstScreen()
              : FutureBuilder(
                  future: auth.tryAutoLogin(), //inside this function there is notifylisteners()
                  builder: (ctx, authResultSnapShot) =>
                      authResultSnapShot.connectionState ==
                              ConnectionState.waiting
                          ? SplashScreen()
                          : AuthScreen(),
                ));
    },
  ),
);

}

Что я получу:

это повторная сборка приложения снова и снова. tryautologin вызывается неоднократно.

Что я хочу:

проверить, вошел ли пользователь только после запуска приложения.

Future<bool> tryAutoLogin() async {
  final prefs = await SharedPreferences.getInstance();
  if (!prefs.containsKey('userData')) {
    return false;
  }
  final extractedUserData = json.decode(prefs.getString('userData'));
  final expiryDate = DateTime.parse(extractedUserData['expiryDate']);
  _accessToken = extractedUserData['accessToken'];
  _refreshToken = extractedUserData['refreshToken'];
  print(extractedUserData['userId']);
  _userId = extractedUserData['userId'];
  if (expiryDate.isBefore(DateTime.now())) { //for now this if statement is not running
    try {
      await _getAccessToken();
    } catch (error) {
      return false;
    }
  }
  print('tryautologin');
  notifyListeners();
  _autoGetAccessToken(); //this function doesn't have any notifylisteners
  return true;
}

отредактировано:

String get accessToken {
  if (_expiryDate != null &&
    _expiryDate.isAfter(DateTime.now()) &&
    _accessToken != null) {
      return _accessToken;
  }
  return null;
}

bool get isAuth {
  print(accessToken != null);
  return accessToken != null;
}
...