扑扑建筑应用程序中的FutureBuilder一次又一次?

时间:2020-01-17 20:46:57

标签: flutter provider

我想做的是检查用户是否已经登录。消费者内部有一个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(),
                ));
    },
  ),
);

}

我得到的:

这一次又一次地重建了应用程序。 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;
}

0 个答案:

没有答案