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 闪屏不换页的主要内容,如果未能解决你的问题,请参考以下文章