如何将一个Future对象中的对象对象加载到另一个对象/类中?

时间:2019-02-13 11:17:36

标签: dart flutter

我有两个Future,它们为我从JSON文件加载字符串。我的目标是拥有一个数据类,在其中可以容纳不同的对象(例如Feed)。我现在不了解的是如何编写一个类数据来保存对象提要,以及如何从Future加载提要对象。

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';
import 'package:freeletics_insights/feed.dart';


Future<String> _loadFeedAsset() async {
  return await rootBundle.loadString('assets/json/userfeed1.json');
}

Future<Feed> loadFeed() async {
  String jsonFeed = await _loadFeedAsset();
  final jsonResponse = json.decode(jsonFeed);
  Feed feed = new Feed.fromJson(jsonResponse);
  //print(feed.feedEntries.length);
  return feed;
}


class Data {
  Feed feed;

  Data.loadData(){
    this.feed = loadFeed();
  }
}

void main{
  var data = Data.loadData();
  print(data.feed.feedEntries.length);
}

我总是得到一个错误,即类型     未来饲料 无法分配给Feed类型。

1 个答案:

答案 0 :(得分:0)

当我第一次开始使用Dart和Flutter时,这曾经使我有些失落。您的loadFeed()方法返回的类型为Future<Feed>,但是您的Data类成员feed的类型为Feed,这是两种不同的类型。您要做的是“解包”从您的Future<Feed>方法返回的loadFeed(),以便访问Feed对象。

您使用Future语法“解包” async/await对象。

看起来可以做的是:

class Data {
  Feed feed;

  Data.loadData() async {
    this.feed = await loadFeed();
  }
}

...但是您loadData()Data的构造函数,并且不能将构造方法标记为async。不过,您可以将main()方法标记为async,以使用async/await语法解开Future<Feed>

我在代码中所做的唯一更改是将feed的{​​{1}}成员添加到构造函数中,并修改了Data方法以异步加载您的供稿并将结果传递到main()对象的构造函数。

Data