首页 > 解决方案 > 如何在颤振中从 API 获取字符串值?

问题描述

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

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

我拥有的数据格式如下:

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

标签: flutterdart

解决方案


从上面提到的 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 文件:

在此处输入图像描述 让我知道它是否有效。


推荐阅读