自定义启动画面,图像抖动

时间:2020-09-10 18:44:47

标签: flutter

我正在开发一个需要异步加载才能在主屏幕上显示的应用程序。 它初始化了一些提供程序类,因此,与其在main()中初始化并使用本机启动屏幕(我无法获得提供程序所需的BuildContext),我决定创建自己的启动屏幕作为小部件。

在我使用Image.asset()添加徽标之前,这种方法效果很好。

图像加载速度太慢,通常比我最初的初始化速度慢,这意味着我的启动屏幕保持空白。

仅供参考,这是我的初始屏幕布局:

Container(
  alignment: Alignment.center,
  color: Theme.of(context).scaffoldBackgroundColor,
  child: Center(
    child: Image.asset("logo.png"),
  )
);

我碰到了功能precacheImage(),但这也需要BuildContext,因此在显示初始屏幕之前无法使用。

有什么更好的方法吗?预先感谢。

3 个答案:

答案 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