Flutter Fatter building应用程序中的FutureBuilder一次又一次?

Flutter Fatter building应用程序中的FutureBuilder一次又一次?,flutter,provider,Flutter,Provider,我试图做的是检查用户是否已经登录。消费者内部有一个futurebuilder,它正在通知听众。检查代码: @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider.value( value: Auth(), ) ], child: Consumer<Auth>( builder: (ct

我试图做的是检查用户是否已经登录。消费者内部有一个futurebuilder,它正在通知听众。检查代码:

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

请参阅Is
isAuth
是否总是返回false?所以
auth.tryAutoLogin()
调用
notifyListeners
,消费者被重建,一遍又一遍地调用
isAuth
?你的
tryAutoLogin()
方法看起来怎么样?@FrankTreacy编辑了这个问题。可能消费者正在重建,而futurebuilder调用tryautologin()调用tryautologin(),tryautologin()包含notifylisteners(),消费者再次重建,这将永远持续下去。@应用程序启动时的FrankTreacy isAuth返回false。在设置accesstoken的tryautologin之后返回true@FrankTreacythanx的帮助isAuth每次都返回false。我没有设定呼气时间,所以影响了isAuth。你可以回答这个问题。
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;
}