Flutter Fatter building应用程序中的FutureBuilder一次又一次?
我试图做的是检查用户是否已经登录。消费者内部有一个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
@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;
}