我正在开发一个需要异步加载才能在主屏幕上显示的应用程序。
它初始化了一些提供程序类,因此,与其在main()
中初始化并使用本机启动屏幕(我无法获得提供程序所需的BuildContext
),我决定创建自己的启动屏幕作为小部件。
在我使用Image.asset()
添加徽标之前,这种方法效果很好。
图像加载速度太慢,通常比我最初的初始化速度慢,这意味着我的启动屏幕保持空白。
仅供参考,这是我的初始屏幕布局:
Container(
alignment: Alignment.center,
color: Theme.of(context).scaffoldBackgroundColor,
child: Center(
child: Image.asset("logo.png"),
)
);
我碰到了功能precacheImage()
,但这也需要BuildContext
,因此在显示初始屏幕之前无法使用。
有什么更好的方法吗?预先感谢。
答案 0 :(得分:1)
我将跳过一些显而易见的解决方案,例如减小图像尺寸。
您确定在正确的位置使用precacheImage
吗?
正确用法如下:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
precacheImage(AssetImage("assets/images/logo.png"), context);
return MaterialApp(
title: 'MyApp',
theme: myTheme,
home: MySplashScreen(),
);
}
}
然后在MySplashScreen中执行以下操作:
ImageProvider logo = AssetImage("assets/images/logo.png");
听起来也很奇怪,但是如果您看不到任何改进,请尝试使用jpg而不是png。
P.S。如果您在调试模式下运行它,可能会很慢,因为在这种模式下Flutter的处理方式,生产速度要快很多倍,请在flutter run --release
答案 1 :(得分:1)
我的启动画面构建类似。徽标的文件大小是多少?
更新:我的徽标是512x512和32k。
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
key: UniqueKey(),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
decoration: null,
margin: EdgeInsets.symmetric(horizontal: _margin),
child: Image.asset("assets/meds.png"),
),
SizedBox(
height: 10,
),
SpinKitDoubleBounce(
color: Theme.of(context).primaryColor,
),
],
),
),
),
);
}
答案 2 :(得分:0)
在应用启动与启动第一批绘画之间始终存在延迟,您可以通过本机实现启动屏幕来获得更好的性能。
https://android.jlelse.eu/launch-screen-in-android-the-right-way-aca7e8c31f52