【问题标题】:How can I get string value from API in flutter?如何在颤振中从 API 获取字符串值?
【发布时间】:2020-06-19 19:51:46
【问题描述】:

我正在尝试从 API 获取 字符串值flutter 中的列表。

每次我尝试获取列表时,都会出现一个异常“未处理的异常:'String' 类型不是'Map' 类型的子类型”

我拥有的数据格式如下:

{
"status": 1,
"data": [
        "Chapter 1",
        "Chapter 2",
        ]
}

【问题讨论】:

标签: flutter dart


【解决方案1】:

使用此响应类加载响应并访问所有变量。

 class ResponseData {
        String status;
        List<String> data;

        ResponseData({
            this.status,
            this.data,
        });

        factory ResponseData.fromJson(Map<String, dynamic> json) => ResponseData(
            status: json["status"],
            data: List<String>.from(json["data"].map((x) => x)),
        );
    }

将我们的响应 json 添加到 ResponseData 类

ResponseData responseDataFromJson(String responseFromServiceCall) => ResponseData.fromJson(json.decode(responseFromServiceCall));

【讨论】:

  • 感谢您的帮助,但它仍然给出错误“[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:类型 'List' 不是子类型类型转换中的“Map”类型“
【解决方案2】:

从上面提到的 json 我为 ListView 创建了一个示例 json:

{
    "status": 1,
    "data": [
        "Chapter 1",
        "Chapter 2"
    ]
}

从 json 创建模型类:

// To parse this JSON data, do
//
//     final data = dataFromJson(jsonString);

import 'dart:convert';

Data dataFromJson(String str) => Data.fromJson(json.decode(str));

String dataToJson(Data data) => json.encode(data.toJson());

class Data {
    int status;
    List<String> data;

    Data({
        this.status,
        this.data,
    });

    factory Data.fromJson(Map<String, dynamic> json) => Data(
        status: json["status"],
        data: List<String>.from(json["data"].map((x) => x)),
    );

    Map<String, dynamic> toJson() => {
        "status": status,
        "data": List<dynamic>.from(data.map((x) => x)),
    };
}

解析数据然后在ui上渲染:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'dummy.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<String> dataList = List();
  bool _isLoading = false;

  @override
  void initState() {
    super.initState();
    loadYourData();
  }

  Future<String> loadFromAssets() async {
    return await rootBundle.loadString('json/parse.json');
  }

  loadYourData() async {
    setState(() {
      _isLoading = true;
    });
    String jsonString = await loadFromAssets();
    final data = dataFromJson(jsonString);
    // here you get the complete object
    dataList = data.data;
    setState(() {
      _isLoading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: _isLoading
              ? CircularProgressIndicator()
              : ListView.builder(
                  itemCount: dataList.length,
                  itemBuilder: (BuildContext context, int index) {
                    return Card(
                      child: Column(

                        children: <Widget>[
                          Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(dataList[index]),
                          ),

                        ],
                      ),
                    );
                  },
                ),
        ),
      ),
    );
  }
}

下面是 parse.json 文件:

下面是您需要定义 json 文件夹的 pubspec 文件:

让我知道它是否有效。

【讨论】:

  • 感谢您的帮助,但它仍然给出错误“[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:无法加载资产:json/parse.json”
  • 因为您必须添加 JSON 文件夹并在其中创建 parse.json 文件,然后您必须在 pubspec.yaml 文件中定义您的 JSON 文件夹。对你来说,我已经编辑了帖子并添加了屏幕截图。
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2021-04-24
  • 2021-06-26
  • 2019-08-11
  • 2020-03-19
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多