#flutter #dart
Вопрос:
//Вот моя заставка
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
super.initState();
init();
}
Future<void> init() async {
await doSomeAsyncStuff();
}
doSomeAsyncStuff() {
User user = Provider.of<User>(context);
if (user == null) {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LoginScreen(),
),
);
} else {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BusinessList(),
));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: Image.asset(
'assets/ledgerslogofinal.png',
width: 250,
height: 250,
),
),
);
}
}
Если пользователь не равен нулю, заставка перенаправляется на BusinessList (), в противном случае она должна перенаправляться на экран входа()
Вот сообщение об ошибке в моей консоли E/flutter (20189): [ОШИБКА:flutter/lib/ui/ui_dart_state.cc(199)] Необработанное исключение: dependOnInheritedWidgetOfExactType<_InheritedProviderScope>() или dependOnInheritedElement() был вызван до завершения _SplashScreenState.initState (). E/flutter (20189): При изменении унаследованного виджета, например, при изменении значения Theme.of (), его зависимые виджеты перестраиваются. Если ссылка зависимого виджета на унаследованный виджет находится в конструкторе или методе initState (), то перестроенный зависимый виджет не будет отражать изменения в унаследованном виджете. E/flutter (20189): Обычно ссылки на унаследованные виджеты должны встречаться в методах построения виджетов (). В качестве альтернативы инициализация, основанная на унаследованных виджетах, может быть размещена в методе didChangeDependencies, который вызывается после initState и всякий раз, когда зависимости впоследствии изменяются.
Комментарии:
1. Почему ты звонишь
Navigator.pop
, прежде чем позвонитьNavigator.push
? Если вы хотите удалитьSplashScreen
из стека навигации, попробуйте использоватьNavigator.pushAndRemoveUntil
Ответ №1:
Я думаю, что вместо того, чтобы выскакивать и проталкивать маршруты внутри состояния инициализации, вам лучше переключиться, чтобы отобразить ваше возвращение :
class SplashScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
User user = Provider.of<User>(context);
return user == null ? LoginScreen() : BusinessList();
}
}
Поэтому, если ваш пользователь не вошел в систему (т. Е. пользователь == null), вы возвращаете свой экран входа в систему, иначе вы возвращаете свой главный экран.
Комментарии:
1. я попробовал ваш код, он работает, но на заставке я хочу показать какое-то изображение
2. предоставленный вами код дает пустую страницу перед перенаправлением
3. я хочу избежать этой пустой страницы, вместо этого мне нужно показать несколько изображений
4. @Vishali, то вы должны предоставить изображение для отображения в AndroidManifest.xml. Я предполагаю, что пустой экран, который вы видите, — это переход между запуском приложения и запуском flutter. Это может вам помочь : flutter.dev/документы/разработка/пользовательский интерфейс/дополнительно/заставка
5. Таймер(продолжительность(в секундах: 1), () { Если (FirebaseAuth.инстанции.текущий пользователь == нуль) { // пользователь не регистрируется ==> логин экрана навигатора.pushAndRemoveUntil(контекст, MaterialPageRoute(строитель: ( ) => LoginScreen()), (маршрут) => ложь); } еще { // пользователь уже вошел в систему ==> домашний экран навигатора.pushAndRemoveUntil( контекст, MaterialPageRoute(строитель: ( ) => BusinessList()), (маршрут) => ложь); } });