【问题标题】:Check if asset exist in flutter检查资产是否存在于颤动中
【发布时间】:2018-10-20 18:38:01
【问题描述】:

如何检查 Flutter 中是否存在特定资产。我正在尝试加载一些图像和声音文件,我需要处理这些资产不存在的情况。

我需要检查是否存在,因为我有从 1 到 1000 的数字的音频文件和图像。当我构建我的小部件时,我使用从 1 到 1000 的循环来构建它。并且资产中可能不存在所需的文件(当前编号的图像或声音)。

【问题讨论】:

    标签: dart flutter assets


    【解决方案1】:

    如果你使用简单的 Image.asset Widget,你可以试试我的解决方案:

    Image.asset(
    'assets/image.jpg',
     errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
                    return Image.network('path');})
    

    【讨论】:

    • 仍然抛出“无法加载资产:...图像资源服务捕获的异常。在解析图像编解码器时抛出了以下断言:”
    【解决方案2】:

    对于 Flutter IO Dev 回答因异常仍然出现而无法工作的人,这对我有用:

    Future<Widget> getDevIcon(String path) async {
      try {
        await rootBundle.load(path);
        return Image.asset(path);
      } catch (_) {
        return SizedBox.shrink();
      }
    }
    

    【讨论】:

      【解决方案3】:

      按照 Raouf 的建议,我处理了资产不存在的情况。

      图像加载器小部件:

      Future<Image> _buildImage() async {
        String path = "assets/images/contents/${content.id}.jpg";
        return rootBundle.load(path).then((value) {
          return Image.memory(value.buffer.asUint8List());
        }).catchError((_) {
          return Image.asset(
            "assets/images/null.png",
            height: 250.0,
          );
        });
      }
      

      在我的构建方法中使用 Image 小部件:

      FutureBuilder(
                future: _buildImage(),
                builder: (BuildContext context, AsyncSnapshot<Image> snapshot) {
                  if (snapshot.connectionState == ConnectionState.done)
                    return snapshot.data;
                  else
                    return Image.asset("assets/images/null.png");
                },
              ),
            ),
      

      【讨论】:

      • 最好不要这样称呼_buildImage()。从FutureBuilder() 调用它可能会导致它在每一帧都被调用。请参阅FutureBuilder api.flutter.dev/flutter/widgets/FutureBuilder-class.html 的文档
      • 这对我不起作用。我在 rootBundle.load 行上遇到异常,并且似乎没有调用 catchError 部分。我也试图把它全部放在 try/catch 中,但这也没有用。这很令人沮丧...
      【解决方案4】:

      我假设您使用AssetBundle 类来加载您的数据,使用load 方法,该方法采用ByteData,当您使用此方法时,如果找不到资产,它将抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-14
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多