是否有不需要 Widget 作为输出的 FutureBuilder 替代方案?

Is there a FutureBuilder alternative that would NOT require a Widget as the output?

这是我的背景图片:

 Container(
           decoration: BoxDecoration(image: DecorationImage(fit: BoxFit.cover, image: FileImage(widget.lightAnimation.imageFile))),
widget.lightAnimation.imageFile: FutureBuilder(
             future: getImageFile(),
             builder: (context, snapshot) => snapshot.data,
           )

Future<File> getImageFile() returns一个File;

问题是输出必须是 Widget,FileBoxDecoration 都不被认为是 Widget 下一个最接近的是 Container,但这对我来说不起作用,因为 Container 的 child 非常健壮,充满了许多变量、函数等

换句话说,我可以做的是:

FutureBuilder(
             future: getImageFile(),
             builder: (context, snapshot) => Container(
          decoration: BoxDecoration(image: DecorationImage(fit: BoxFit.cover, image: FileImage(snapshot.data))),
          ),
           )

但是,在这种情况下,我将不得不将我所有的大 child 移动到 FutureBuilder,因为 Container 会随身携带它,而我不想这样做。

有没有我可以使用不需要 Widget 作为输出的替代方案来代替 FutureBuilder?或者也许有其他可能的方法来制作我的背景图片,未来“builder/maker/function”?

这就是 ValueListenableBuilder 的目的。

 ValueListenableBuilder<File>(
                valueListenable: imageFile,
                builder: (_, _imageFile, __) {
                  return  Container(
           decoration: BoxDecoration(image: DecorationImage(fit: BoxFit.cover, image: _imageFile ));
                })

imageFile 必须是 ValueNotifier<File>。有两种方式:

  • 像这样声明 imageFile:
final imageFile = ValueNotifier<File>("initial_File");
  • 或像这样在单独的 class 中:
class ImageFile extends ValueNotifier<File> {
updateFile() => value='newFile';
}

虽然将 FilePath 实现为一个可监听的变量比将 File 实现更好。