检查资产是否存在。

12
在尝试加载数据之前,有没有办法在Flutter中检查资产文件是否存在?
目前我的代码是这样的:
String data;
try {
  data = await rootBundle
      .loadString('path/to/file.json');
} catch (Exception) {
  print('file not found');
}

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

我的完整代码如下:

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

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

2个回答

13

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";
}

1
这段代码似乎无效,因为myLoadAsset总是返回非空值。毕竟你没有使用await - Hentioe

0

我相信更好的版本是不需要用 try/catch:

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接