检查资产是否存在

问题描述 投票:0回答:3

在尝试加载数据之前,有什么方法可以检查Flutter中是否存在资源文件?

目前我有以下内容:

String data;
try {
  data = await rootBundle
      .loadString('path/to/file.json');
} catch (Exception) {
  print('file not found');
}

问题是,我必须检查文件 1,如果它不存在,我必须检查后备文件(文件 2),如果它也不存在,我加载第三个文件。

我的完整代码如下所示:

try{
  //load file 1
} catch (..) {
  //file 1 not found
  //load file 2
} catch (...) {
  //file 2 not found
  //load file 3
}

这对我来说看起来很丑,但我没有更好的想法......

file dart try-catch flutter assets
3个回答
14
投票

AssetBundle
(由
rootBundle
返回)抽象了加载资源的不同方式(本地文件、网络),并且没有通用的方法来检查它是否存在。

您可以轻松包装您的加载代码,使其变得不那么“丑陋”。

  Future myLoadAsset(String path) async {
    try {
      return await rootBundle.loadString(path);
    } catch(_) {
      return null;
    }
  } 
var assetPaths = ['file1path', 'file2path', 'file3path'];
var asset;

for(var assetPath in assetPaths) {
  asset = await myLoadAsset(assetPath);
  if(asset != null) {
    break; 
  }
}

if(asset == null) {
  throw "Asset and fallback assets couldn't be loaded";
}

0
投票

我相信更好的版本是不需要尝试/捕获的版本:

import 'dart:convert';
import 'package:flutter/services.dart';

Future<bool> isLocalAsset(final String assetPath) async {
  final encoded = utf8.encoder.convert(Uri(path: Uri.encodeFull(assetPath)).path);
  final asset = await ServicesBinding.instance.defaultBinaryMessenger.send('flutter/assets', encoded.buffer.asByteData());
  return asset != null;
}

0
投票

在图像的特殊情况下,

Image.asset
有一个
errorBuilder

例如:

Image.asset('imageX', errorBuilder: (ctx, error, stackTrace) => Image.asset('fallback.png'))

这可能是更简单的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.