readModelsFromFile<T> static method

Future<List<T>> readModelsFromFile<T>(
  1. String filePath,
  2. T fromJson(
    1. Map<String, dynamic>
    ), {
  3. bool fromAsset = false,
})

从文件中读取 JSON 数组并解析为对象列表

filePath JSON 文件路径 fromJson JSON 映射到 T 类型对象的工厂函数 fromAsset 是否从 Assets 中读取(默认false,即从沙盒文件读取)

返回值: Future<List<T>> 解析后的对象列表,文件不存在或异常时返回空列表

使用示例:

// 从沙盒文件读取
List<WheelModel> models = await JsonUtil.readModelsFromFile<WheelModel>(
  '/tmp/wheels.json',
  (json) => WheelModel.fromJson(json),
);

// 从 Assets 读取
List<WheelModel> models = await JsonUtil.readModelsFromFile<WheelModel>(
  'assets/data/wheels.json',
  (json) => WheelModel.fromJson(json),
  fromAsset: true,
);

Implementation

static Future<List<T>> readModelsFromFile<T>(
  String filePath,
  T Function(Map<String, dynamic>) fromJson, {
  bool fromAsset = false,
}) async {
  try {
    String jsonString;
    if (fromAsset) {
      jsonString = await rootBundle.loadString(filePath);
    } else {
      final file = File(filePath);
      if (!file.existsSync()) {
        return [];
      }
      jsonString = await file.readAsString();
    }
    final List<dynamic> data = jsonDecode(jsonString) as List<dynamic>;
    return data
        .map((item) => fromJson(item as Map<String, dynamic>))
        .toList();
  } catch (e) {
    Logger.log('Error reading models from file: $e');
    return [];
  }
}