-2

如何加载 AssetImage 或检查它是否存在?数据来自 api,因此我无法将所有文件路径列为常量。

例如,路径可能是“assets/images/${card.imageType}.png”,其中 card.inageType 是一个变量。

...
child: Image(
       height: 60.0,
       image: Utils.getImage('assets/images/card-${card.category}.png'),
       ),
...

对于我的 getImage 函数,我尝试了 2 种但不工作

方法 1:使用文件:existsSync 方法始终为 false。请记住,等待异步无法工作,因为 Image 小部件期望不是 Future

static dynamic getImage(path) {
    File f = File(path);
    return f.existsSync()
        ? FileImage(f)
        : const AssetImage('assets/images/default.png');
  }
}

方法2:使用try catch:未捕获异常

  static AssetImage getImage(path) {
    AssetImage image;

    try {
      image = AssetImage(path);
    } catch (e) {
      image = const AssetImage('assets/images/default.png');
    }

    return image;
  }
4

3 回答 3

0

您可以使用类似这样的方法来检查资产是否存在:

// example: 'assets/check_green.png' 
Future<bool> checkIfAssetExists(String fullAssetPath) async {
  final Uint8List encoded = Utf8Codec()
      .encoder
      .convert(Uri(path: Uri.encodeFull(fullAssetPath)).path);
  // returns null if an asset is not found
  final ByteData? asset = await ServicesBinding.instance!.defaultBinaryMessenger
      .send('flutter/assets', encoded.buffer.asByteData());
  return asset != null;
}

你可以在你的中运行它initState,然后AssetImage自信地使用。

至于没有被捕获的异常,可能意味着与sError不同的 was throwException

于 2022-02-03T12:20:16.637 回答
0

您可以使用以下代码检查文件是否异步存在:

import 'dart:io';
File("path/to/file").exists() 

或同步检查:

import 'dart:io';
File("path/to/file").existsSync()

更新:

isPathExists() 函数从 initState 调用。

AssetBundle 用于获取资产文件夹中的资产。如果存在,您可以向menubanner.png插入任何内容,图像将分配给变量,如果不存在,则会引发异常。


  late Image image;
  isPathExists() async {
    try {
      var assetbundle = DefaultAssetBundle.of(context);
      ByteData res = await assetbundle.load('assets/images/menubanner.png');
      var list = Uint8List.sublistView(res);
      setState(() {
        image = Image.memory(list);
      });
    } catch (exception) {
      print(exception);
    }
  }

于 2022-02-03T11:37:09.753 回答
-1

您不能将资产图像用于从网络获取的图像。

一旦你从你的 api 得到响应。将图像的 url 存储在 String 变量中。通常来自 API 的图像存储在 Web 服务中。

当您拥有图像的 url 时,只需使用 NetworkImage 小部件,例如:

SizedBox(
     width: 75,
     height: 75,
     child: userImgUrl.isEmpty
     ? const CircleAvatar(
     child: Text('Avatar'))
     : CircleAvatar(
          radius: 30,
          backgroundImage: NetworkImage(
                             userImgUrl),
                             backgroundColor: Colors.transparent),)

认为 userImgUrl 是包含可以在 Internet 上找到的图像的 url 的字符串。如果图像为空,则仅在圆形头像内显示文本。如果图像可从 API 获得,则在NetworkImage()中显示图像

于 2022-02-03T11:30:28.850 回答