То, что вы хотите сделать, это добавить перенаправление внутри кода .then, чтобы оно запускалось сразу после завершения setRole. Вам не нужен setState внутри, потому что он бесполезен. Причина, по которой setState запускается несколько раз, заключается в том, что при каждом вызове setState функция Widget build (...) запускается снова, поэтому вы вводите бесконечное значение l oop. Выньте setState и перенаправьте, как только роль будет определена. Я думаю, что это решит вашу проблему. Код вам нужен ниже. Пожалуйста, проголосуйте и примите это как ответ (щелкните галочкой), если это решит вашу проблему.
Еще одна точка исправления. Скорее всего, вам придется инициализировать вашу пользовательскую переменную и переменную _auth вне функции сборки. В Dart / Flutter после setState вся сборка запускается снова, и поэтому эти переменные нельзя использовать вне функции сборки. Попробуйте инициализировать эти переменные внутри функции @override initState (...).
User user;
AuthService _auth;
bool isLoaded = false;
@override
void initState() {
super.initState();
user = Provider.of<User>(context);
AuthService _auth = AuthService();
}
@override
Widget build(BuildContext context) {
if (!isLoaded) {
if(user == null){
return SignIn();
}
else {
getRoleWrapper(user, _auth).then((s) {
user.setRole(s);
setState(() {
isLoaded = true;
});
});
}
}
return isLoaded ?
user.role == "administrateur" ?
PageTestAdmin() : BasicClient()
:
Container();
}
Future<String> getRoleWrapper (User user, AuthService auth) async{
String role = await auth.getRole(user);
return role;
}