你好,我想弄清楚工厂构造函数在 dart 中是如何工作的

问题描述

我从 Flutter.dev 中获取了使用工厂从互联网获取数据的代码

import 'dart:convert';

Future<Album> fetchAlbum() async {
  final response = await http.get('https://jsonplaceholder.typicode.com/albums/1');

  if (response.statusCode == 200) {
    // If the server did return a 200 OK response,// then parse the JSON.
    return Album.fromJson(jsonDecode(response.body));
  } else {
    // If the server did not return a 200 OK response,// then throw an exception.
    throw Exception('Failed to load album');
  }
}

class Album {
  final int userId;
  final int id;
  final String title;

  Album({this.userId,this.id,this.title});

  factory Album.fromJson(Map<String,dynamic> json) {
    return Album(
      userId: json['userId'],id: json['id'],title: json['title'],);
  }
}

我曾尝试在我的代码中重复它,但没有奏效。我很困惑为什么它不起作用,因为我和示例中的一样。

Future<Album> fetchAlbum() {

  Map<String,dynamic> map = {
    "photo": "another data","id": "dsiid1dsaq",};

  return Album.fromJson(map);
}

class Album {

  String photo;
  String id;

  Album({this.photo,this.id});

  factory Album.fromJson(Map<String,dynamic> json) {
    return Album(
      photo: json['photo'],)`
  }
}

它告诉我:“无法从函数 'fetchAlbum' 返回类型为 'Album' 的值,因为它的返回类型为 'Future'。”

解决方法

问题不在于 factory 构造函数本身。问题是您将函数 fetchAlbum 声明为 Future<Album> 类型,而实际上它仅返回同步 Album...

Flutter 文档中的示例的返回类型为 Future<T>,因为它在处理网络请求时使用了 asyncawait 关键字,因此它返回 Future

变化:

Album fetchAlbum() {

  Map<String,dynamic> map = {
    "photo": "another data","id": "dsiid1dsaq",};

  return Album.fromJson(map);
}
,

希望可以帮到你。

Future<Album> fetchAlbum() async {

  Map<String,};

  return Album.fromJson(map);
}

或者像这样

Album fetchAlbum() {

  Map<String,};

  return Album.fromJson(map);
}