Браузеры были снисходительны к этому (много лет назад, когда css был молод) и позволяют использовать ID более одного раза.
Однако идентификаторы yes должны быть уникальными и использоваться только один раз.
Если вам нужно использовать css-форматирование более одного раза, используйте CLASS.
Ваша проблема в том, что ваш метод сборки возвращается до того, как ваше будущее getSharedPrefs будет завершено. GetSharedPrefs возвращается мгновенно, как только он вызывается, потому что он асинхронный, и вы рассматриваете его как «огонь и забыть», не ожидая. Видя, что вы не можете ждать в своей функции initState, которая имеет смысл.
Здесь вы хотите использовать виджет FutureBuilder. Создайте Future, который возвращает логическое значение (или enum, если вам нужно больше состояний), и используйте будущего строителя в качестве домашнего ребенка, чтобы вернуть правильный виджет.
Создайте свое будущее
Future<bool> showLoginPage() async {
var sharedPreferences = await SharedPreferences.getInstance();
// sharedPreferences.setString('user', 'hasuser');
String user = sharedPreferences.getString('user');
return user == null;
}
Когда пользователь имеет значение null, это вернет true. Используйте это будущее в построителе будущего, чтобы выслушать изменения стоимости и ответить соответствующим образом.
@override
Widget build(BuildContext context) {
return MaterialApp(home: FutureBuilder<bool>(
future: showLoginPage(),
builder: (buildContext, snapshot) {
if(snapshot.hasData) {
if(snapshot.data){
// Return your login here
return Container(color: Colors.blue);
}
// Return your home here
return Container(color: Colors.red);
} else {
// Return loading screen while reading preferences
return Center(child: CircularProgressIndicator());
}
},
));
}
Я запустил этот код, и он отлично работает. Вы должны увидеть синий экран, когда требуется вход в систему, и красный экран, когда присутствует пользователь. Раскомментируйте строку в showLoginPage для тестирования.