【问题标题】:Flutter Splash screen is not changing pagesFlutter 闪屏不换页
【发布时间】:2021-11-21 01:30:11
【问题描述】:

//这是我的启动画面

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(),否则它必须重定向到 LoginScreen()

这是我控制台中的错误消息 E/flutter (20189): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:在_SplashScreenState.initState() 完成之前调用了dependOnInheritedWidgetOfExactType<_inheritedproviderscope>() 或dependOnInheritedElement()。 E/flutter (20189):当继承的小部件发生变化时,例如,如果 Theme.of() 的值发生变化,则重新构建其依赖的小部件。如果依赖小部件对继承小部件的引用在构造函数或 initState() 方法中,则重建的依赖小部件将不会反映继承小部件中的更改。 E/flutter (20189):通常对继承的小部件的引用应该出现在小部件的 build() 方法中。或者,可以将基于继承的小部件的初始化放在 didChangeDependencies 方法中,该方法在 initState 之后以及此后依赖关系发生变化时调用。

【问题讨论】:

  • 为什么在调用Navigator.push 之前先调用Navigator.pop?如果您想从导航堆栈中删除SplashScreen,请尝试使用Navigator.pushAndRemoveUntil

标签: flutter dart


【解决方案1】:

我认为与其在 initState 中弹出和推送路线,不如切换至您的返回屏幕:

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    User user = Provider.of<User>(context);
    return user == null ? LoginScreen() : BusinessList();
  }
}

因此,如果您的用户未登录(即 user == null),则返回 LoginScreen,否则返回主屏幕。

【讨论】:

  • 我已经尝试过你的代码,但在启动画面中我想显示一些图像
  • 您提供的代码在重定向之前给出了空白页
  • 我想避免出现空白页面,而是需要显示一些图像
  • @Vishali 然后您必须提供要在 AndroidManifest.xml 中显示的图像。我猜你看到的空白屏幕是应用程序启动和颤振开始之间的过渡。这可以帮助你:flutter.dev/docs/development/ui/advanced/splash-screen
  • Timer(Duration(seconds: 1), () { if (FirebaseAuth.instance.currentUser == null) { // 用户未登录 ==> 登录屏幕 Navigator.pushAndRemoveUntil(context, MaterialPageRoute( builder: () => LoginScreen()), (route) => false); } else { // 用户已经登录 ==> 主屏幕 Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: () >) => BusinessList()), (route) => false); } });
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 2018-10-12
  • 2022-10-05
  • 2020-10-04
  • 2021-11-07
  • 2016-06-10
  • 2019-07-01
  • 2020-09-03
相关资源
最近更新 更多