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

Hello, I'm trying to figure out how factory constructor working in dart

我从 flutter.dev 中获取了代码,它使用工厂从 Internet 获取数据。

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'],
      id: json['id'],
    )`
  }
}

它告诉我:“'Album' 类型的值不能从函数 'fetchAlbum' 中被 return 编辑,因为它有一个 return 类型的 'Future'."

问题不在 factory 构造函数本身。问题是你声明你的函数 fetchAlbumFuture<Album> 类型,而实际上它 return 只是一个同步 Album...

Flutter 文档中的示例有一个 return 类型的 Future<T> 因为它在处理网络请求时使用了 asyncawait 关键字所以它 returns Future.

变化:

Album fetchAlbum() {

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

  return Album.fromJson(map);
}

希望对您有所帮助。

Future<Album> fetchAlbum() async {

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

  return Album.fromJson(map);
}

或者像这样

Album fetchAlbum() {

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

  return Album.fromJson(map);
}