【问题标题】:Custom Splash Screen with Image in flutter带有抖动图像的自定义启动画面
【发布时间】:2020-12-29 07:38:33
【问题描述】:

我正在开发一个需要在我的主屏幕出现之前进行异步加载的应用程序。 它初始化了一些提供程序类,因此我没有在main() 中进行初始化并使用本机启动画面(我无法获得提供程序所需的BuildContext),而是决定创建自己的启动画面作为小部件。

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

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

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

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

我遇到了precacheImage()这个函数,但是这也需要BuildContext,所以在闪屏出现之前不能使用。

有没有更好的方法来解决这个问题?提前致谢。

【问题讨论】:

  • 你在pubspec中添加图片的路径吗
  • @evan 当然是的 :)

标签: flutter


【解决方案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,
              ),
            ],
          ),
        ),
      ),
    );
  }

【讨论】:

  • 我的目前是 8300x8300。我考虑过减小图像尺寸,但我已经在目标屏幕上看到了锐利的边缘。我想我应该试着减少一点。
【解决方案2】:

在应用启动和 Flutter 首次绘制之间总是存在延迟,通过原生实现启动画面,您将获得更好的性能。

https://android.jlelse.eu/launch-screen-in-android-the-right-way-aca7e8c31f52

【讨论】:

  • 我必须初始化需要 BuildContext 的提供程序模型,所以我无法在 main 中初始化它(显示本机启动屏幕的位置)。
  • 不,原生闪屏是在 android 和 ios 的 Flutter 代码之外构建的。
  • 我认为我们在谈论不同的东西。我知道你可以构建原生 ios/android 启动画面,这是在 main() 执行时和 runApp() 之前显示的屏幕。你可以在 runApp 之前初始化一些东西,但是那样你就不能得到 BuildContext。这就是为什么我必须制作自定义闪屏而不是原生屏幕。
【解决方案3】:

我将跳过明显的解决方案,例如减小图像大小.. 你确定你在正确的地方使用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。

附:如果你在调试模式下运行它可能会很慢,因为在这种模式下如何处理 Flutter,生产速度要快很多倍,请在真实设备上尝试flutter run --release

【讨论】:

  • 图片为透明背景,无法转成jpg。
  • 我认为 precacheImage 应该在屏幕显示之前而不是在它之前使用?尝试了您提供的代码并在发布模式下运行,但似乎几乎没有改进:(
  • 好吧,如果你的图像是 8300x8300,​​难怪它可能会滞后.. 而且你需要透明度,嗯.. 没有看到图像就不能提出太多建议,但在这一点上,我会尝试考虑优化图像本身的方法=/
  • 是的,我缩小了图像尺寸,它明显改善了很多。你说得对,那我会尝试对图像做点什么。
猜你喜欢
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多