Flutter 闪屏不换页

Posted

技术标签:

【中文标题】Flutter 闪屏不换页【英文标题】:Flutter Splash screen is not changing pages 【发布时间】: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 【参考方案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); );

以上是关于Flutter 闪屏不换页的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的闪屏实现

flutter 打开应用的闪屏动画

Flutter 中的动态闪屏

如何在 Flutter 中为闪屏创建渐变色背景?

Flutter 闪屏页面 3s的一个透明渐变动画

flutter闪屏过渡动画,闪光占位动画