首页 > 解决方案 > 如何在类对象中转换 API 的响应

问题描述

我有一个类SuperHero和一个 API 消耗,它返回一个包含我想要创建新 SuperHero 的值的响应,但我对如何做到这一点有点困惑。

这是我的课:

import 'dart:convert';

SuperHero superHeroFromJson(String str) => SuperHero.fromJson(json.decode(str));

String superHeroToJson(SuperHero data) => json.encode(data.toJson());

class SuperHero {
    SuperHero({
        this.name,
        this.mainPower,
        this.worstEnemy,
    });

    String name;
    String mainPower;
    String worstEnemy;

    factory SuperHero.fromJson(Map<String, dynamic> json) => SuperHero(
        name: json["name"],
        mainPower: json["mainPower"],
        worstEnemy: json["worstEnemy"],
    );

    Map<String, dynamic> toJson() => {
        "name": name,
        "mainPower": mainPower,
        "worstEnemy": worstEnemy,
    };
}

超级英雄控制器

class SuperHeroController {
  final String hero;

  SuperHeroController({this.hero}){
    loadData(hero);
  }

  Future<Map<String, dynamic>> loadData(String usuario) async {
    final String url = ****;

    final Map<String, dynamic> queryParams = {
      'hero': hero,
    };

    var uri = Uri.parse(url).resolveUri(Uri(queryParameters: queryParams));

    final response = await http.get(
      uri,
      headers: {"Content-Type": "application/json"},
    );

    var data = json.decode(response.body);

    print(data);
  }
}

我的小部件

SuperHero hero;
  SuperHeroController _superHeroController;

  HeroWidget(hero){
    hero = hero;
  }

  @override
  void initState() {
    super.initState();
    _heroController = SuperHeroController (hero: Provider.of<Auth>(context, listen: false).id); // getting the user's hero id
  }

运行此代码,调用 initState,它在控制台中显示我必须在 SuperHero 类中构建的结构,但我不知道该怎么做。我在哪里运行方法 SuperHeroFromJson 返回并获取带有响应的对象 SuperHero?

标签: flutterdart

解决方案


就像是:

@override
void initState() {
  super.initState();
  _heroController = SuperHeroController(hero: Provider.of<Auth>(context, listen: false).id);
  _loadHero();
}

_loadHero() async {
    hero = await _heroController.loadData();
}

和控制器...

class SuperHeroController {
  final String hero;

  SuperHeroController({this.hero});

  Future<SuperHero> loadData() async {
    ...
    var data = json.decode(response.body);
    return SuperHero.fromJson(data);
  }
}

推荐阅读