说明:

我有一个包含两个小部件的堆栈.Widget1(作为背景)是由4个组件组成的网格,Widget2是Widget1顶部的半透明矩形彩色容器建筑.堆栈正在按预期构建这两个小部件!

问题:

Widget2是在Widget1之前进行视觉渲染的,这会导致尴尬的效果,因为Widget2是在空背景上渲染的.我假设这是由子堆栈异步构建引起的,然而AssetImage是一个同步调用...

问题:

如何使Widget2渲染等待widget1,直到widget1作为背景完全可见?

注意,我已经try 了WidgetBindings.例子addPostframeCallback

非常感谢,

推荐答案

解决方案1

我认为没有必要等待widget1.在显示widget1widget2assets资源 之前,可以使用precacheImage路预缓存它们.这样他们几乎马上就会表现出来.

await precacheImage(AssetImage('assets/widget1.png'), context);
await precacheImage(AssetImage('assets/widget2.png'), context);

从文档中,在调用precacheImage之后:

如果图像稍后被ImageBoxDecorationFadeInImage使用,则加载速度可能会更快.图像的使用者不需要使用相同的ImageProvider实例.只要两个图像共享同一密钥,并且图像由缓存保存,ImageCache就会找到图像.

解决方案2

否则,可以使用Future.delayed等待widget1渲染.对delayed的调用应该是构建widget2的某个标志的setState,比如说bool _buildWidget2 = false标志.类似于以下代码段:

Future.delayed(
  Duration(milliseconds: 150),
  () => setState(() => _buildWidget2 = true),
);

然后在Stack上应该是:

Stack(
  children: [
    Widget1(),
    if (_buildWidget2)
      Widget2(),
  ],
)

Flutter相关问答推荐

如何等待抖动S定时器.定期取消?

Fighter:基于ChangeNotifier状态动态更新AppBar中的图标

Flutter 中的多页表现

我有一个问题:类型';()=>;Null';不是类型转换中类型';(Int)=>;void';的子类型

如何在扩展其他小部件时访问Ref

如何使DropDownMenu宽度等于TextFormfield?

Supabase Auth:重定向到 Google.com 而不是我的应用程序

在Flutter中为容器实现线性渐变背景动画

Firebase Auth - 有没有办法为新用户预先生成 UID?

如何将行推到列的底部

Flutter 动保存新的变量值

具有 BLOC 和存储库模式的 Flutter Workmanager

alert 对话框内的 ListView 显示空的透明窗口

对话框打开时如何使背景模糊?

我无法从 Cloud firestore 访问文档字段并在 statefulwidget 类中显示它

Getx Flutter 在更新值时抛出空错误

如何使按钮被选中?

Flutter:如何将列表转换为字符串?

如何使用 Riverpod 在运行时动态创建提供程序?

RangeError(索引):无效值:有效值范围为空:点击文章时为0