Flutter-如何将JSON数据解析为基类?

时间:2019-05-03 09:22:01

标签: dart flutter

我想知道如何将JSON数据解析为基类,因为我正在尝试编写,但是遇到未处理的异常:类型'Future'不是类型转换中类型'WeatherModel'的子类型。 这是我的代码:

abstract class BaseModel {
  fromJson(Map<String, dynamic> json);

  Map<String, dynamic> toJson();
}
import 'BaseModel.dart';

class WeatherModel extends BaseModel {
  String success;
  Result result;
  Records records;

  WeatherModel({this.success, this.result, this.records});
  @override
  fromJson(Map<String, dynamic> json) {
    //...
  }

  @override
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    //... parse to Json
    return data;
  }
}

}

import 'dart:async';
import 'package:dio/dio.dart';
import 'package:flightinfo/model/BaseModel.dart';

class HttpUtils {
 static Future<BaseModel> get(String url, Map<String, dynamic> params, BaseModel baseModel) async {
    try {
      print("url:$url,params:$params");
      Response response = await Dio().get(url, queryParameters: params);
      if (response != null && response.statusCode == 200) {
        baseModel.fromJson(response.data);
        print(baseModel);
        return baseModel;
      }
      print(response);
    } catch (exception) {
      print(exception);
    }
    return null;
  }
}

class WeatherRequest {
  Future<WeatherModel> get() async {
    return HttpUtils.get(_url, _params,new WeatherModel());
  }
}

我认为HttpUtils.get直接指向BaseModel具有扩展性。这在Java中很常见,但是在Dart中,我在WeatherRequest的下面一行中得到一个例外:

return HttpUtils.get(_url, _params,new WeatherModel());

  

未处理的异常:类型“未来”不是类型转换中类型“天气模型”的子类型

在Dart中,如何照顾演员?

1 个答案:

答案 0 :(得分:0)

由于get()的{​​{1}}方法将WeatherRequest返回到Future,但您却返回了WeatherModel,因此可能会发生错误。

  

尝试添加Future<BaseModel>来解决await转换为Future的问题,然后再返回。

BaseModel

此外,根据此SO answer

  

您可以将一个对象强制转换为其父类,但是不能将一个对象强制强制转换为其子类。

因此,将return (await HttpUtils.get(_url, _params,new WeatherModel()) ); 隐式转换为BaseModel可能无法正常工作。相反,您可以像WeatherModel一样向BaseModel添加一个辅助方法并返回BaseModel.toWeatherModel

WeatherModel

或修改abstract class BaseModel { toWeatherModel(){ //... } } 的{​​{1}}方法以返回get

WeatherRequest