首页 > 解决方案 > 输入'列表' 不是类型 'List 的子类型'函数结果'

问题描述

我想将List data;(List < dynamic> data) 更改为 List<MaintenanceInfo> data;

class MaintenanceInfo {
  final String serial;

  MaintenanceInfo({this.serial,});

  factory MaintenanceInfo.fromJson(Map<String, dynamic> json) {
    return new MaintenanceInfo(
      serial: json['serial'], );}}

或者有什么方法可以将 JSON 数据提取为 forEach?

我正在尝试遵循此示例(https://stackoverflow.com/a/50569613/12908336)并面临这样的问题。

标签: jsonflutter

解决方案


查看我为您创建的这个示例:

import 'dart:async';

import 'package:flutter/material.dart';
import 'dart:convert';
//import 'package:http/http.dart' as http;

void main() => runApp(new MaterialApp(
      home: new HomePage(),
      debugShowCheckedModeBanner: false,
    ));

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
  TextEditingController controller = new TextEditingController();

  String apiData =
      '''{"ResultText": "Success","ResultStatus": 0,"data": [{"serial": "sample1"},{"serial": "sample2"},{"serial": "sample3"},{"serial": "sample4"},{"serial": "sample5"},{"serial": "sample6"}]} ''';

  // Get json result and convert it to model. Then add
  Future<Null> getUserDetails() async {
    // final response = await http.get(url);
    // final responseJson = json.decode(response.body);
    // this is where you apis gets hit i have taken the sample json you provided.

    final maintenanceInfo = maintenanceInfoFromJson(apiData);

    setState(() {
      /*   for (Map user in responseJson) {
        _userDetails.add(UserDetails.fromJson(user));
      } */
      maintenanceInfo.data.forEach((element) {
        _userDetails.add(element);
      });
    });
  }

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

    getUserDetails();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Home'),
        elevation: 0.0,
      ),
      body: new Column(
        children: <Widget>[
          new Container(
            color: Theme.of(context).primaryColor,
            child: new Padding(
              padding: const EdgeInsets.all(8.0),
              child: new Card(
                child: new ListTile(
                  leading: new Icon(Icons.search),
                  title: new TextField(
                    controller: controller,
                    decoration: new InputDecoration(
                        hintText: 'Search', border: InputBorder.none),
                    onChanged: onSearchTextChanged,
                  ),
                  trailing: new IconButton(
                    icon: new Icon(Icons.cancel),
                    onPressed: () {
                      controller.clear();
                      onSearchTextChanged('');
                    },
                  ),
                ),
              ),
            ),
          ),
          new Expanded(
            child: _searchResult.length != 0 || controller.text.isNotEmpty
                ? new ListView.builder(
                    itemCount: _searchResult.length,
                    itemBuilder: (context, i) {
                      return new Card(
                        child: new ListTile(
                          title: new Text(_searchResult[i].serial),
                        ),
                        margin: const EdgeInsets.all(0.0),
                      );
                    },
                  )
                : new ListView.builder(
                    itemCount: _userDetails.length,
                    itemBuilder: (context, index) {
                      return new Card(
                        child: new ListTile(
                          title: new Text(_userDetails[index].serial),
                        ),
                        margin: const EdgeInsets.all(0.0),
                      );
                    },
                  ),
          ),
        ],
      ),
    );
  }

  onSearchTextChanged(String text) async {
    _searchResult.clear();
    if (text.isEmpty) {
      setState(() {});
      return;
    }

    _userDetails.forEach((userDetail) {
      if (userDetail.serial.contains(text)) _searchResult.add(userDetail);
    });

    setState(() {});
  }
}

List<Serials> _searchResult = [];

List<Serials> _userDetails = [];

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

MaintenanceInfo maintenanceInfoFromJson(String str) =>
    MaintenanceInfo.fromJson(json.decode(str));

String maintenanceInfoToJson(MaintenanceInfo data) =>
    json.encode(data.toJson());

class MaintenanceInfo {
  MaintenanceInfo({
    this.resultText,
    this.resultStatus,
    this.data,
  });

  String resultText;
  int resultStatus;
  List<Serials> data;

  factory MaintenanceInfo.fromJson(Map<String, dynamic> json) =>
      MaintenanceInfo(
        resultText: json["ResultText"],
        resultStatus: json["ResultStatus"],
        data: List<Serials>.from(json["data"].map((x) => Serials.fromJson(x))),
      );

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

class Serials {
  Serials({
    this.serial,
  });

  String serial;

  factory Serials.fromJson(Map<String, dynamic> json) => Serials(
        serial: json["serial"],
      );

  Map<String, dynamic> toJson() => {
        "serial": serial,
      };
}

让我知道它是否有效。


推荐阅读