Заставка Flutter не меняет страницы

#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()), (маршрут) => ложь); } });