List <dynamic>'不是强制类型转换中'List <obj>'类型的子类型

时间:2018-08-06 06:22:04

标签: dart flutter flutter-dependencies

我正在尝试创建动态下拉列表,该列表的值是使用微服务从查找表之一填充的,但是直到现在为止我还没有成功地使它起作用。因为我对飞镖/颤振是完全陌生的 所以任何人都可以在下面的代码中找出我做错了什么

以下代码用于调用网络服务

Future<List<CountryDropDownList>> getCountriesDetails(String url) async{
    HttpClient httpClient = new HttpClient();
    HttpClientRequest request = await httpClient.getUrl(Uri.parse(url));
    // request.headers.set('content-type', 'application/json');
    print("request data "+request.toString());
    HttpClientResponse microServicesResponse= await request.close();
    String microServicesResponseString = await microServicesResponse.transform(utf8.decoder).join();
    final parsed = await json.decode(microServicesResponseString).cast<Map<String, dynamic>>();
    httpClient.close();
    print("Data Recieved   "+microServicesResponseString.toString());
    return parsed
        .map<CountryDropDownList>(
            (json) => CountryDropDownList.fromJson(json))
        .toList();
  }

这是我的对象类型

class CountryDropDownList{

  String countryName;
  List<StateDropDownList> stateDropDownList;


  CountryDropDownList({this.countryName, this.stateDropDownList});

  factory CountryDropDownList.fromJson(Map<String, dynamic> json) {
    return CountryDropDownList(
      countryName: json['countryName'] as String,
      stateDropDownList: json['states'] as List<StateDropDownList>,
    );
  }
}

,仅用于显示截至目前运行的代码

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

      @override
      _CenterFoundationSubmissionState createState() => new _CenterFoundationSubmissionState();
    }

    class _CenterFoundationSubmissionState extends State<CenterFoundationSubmission> {

      NetworkUtil _netUtil = new NetworkUtil();

      var url = "SomeUrl";

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


      @override
      Widget build(BuildContext context) {
        var futureBuilder = new FutureBuilder(
          future: _getData(),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
              case ConnectionState.waiting:
                return new Text('loading...');
              default:
                if (snapshot.hasError)
                  return new Text('Exception here is : ${snapshot.error}');
                else
                  return createView(context, snapshot);
            }
          },
        );

        return new Scaffold(
          appBar: new AppBar(
            title: new Text("Center Foundation"),
          ),
          body: futureBuilder,
        );

      }

      Future<List<CountryDropDownList>> _getData() async {
        List<CountryDropDownList> values = new List<CountryDropDownList>();
        values.addAll(_netUtil.getCountriesDetails(url) as List<CountryDropDownList>);

/*Error Added here , i am getting error while casting list to my object type*/


        await new Future.delayed(new Duration(seconds: 10));

        return values;
      }

      Widget createView(BuildContext context, AsyncSnapshot snapshot) {
        List<CountryDropDownList> values = snapshot.data;
        return new ListView.builder(
          itemCount: values.length,
          itemBuilder: (BuildContext context, int index) {
            return new Column(
              children: <Widget>[
                new ListTile(
                  title: new Text(values[index].countryName),
                  subtitle:  new Text(values[index].stateDropDownList[index].statesName),
                  trailing:   new Text(values[index].stateDropDownList[index].districtDropDownList[index].districtsName),
                ),
                new Divider(height: 2.0,),
              ],
            );
          },
        );
      }
    }

我所做的事情我曾尝试通过多种方式调用Web服务,尝试使用JSON字符串响应直接转换服务响应,也许是我尝试过的事情。

请在这里提供帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用List.from()构造函数吗?这是相同的链接:

https://api.dart.dev/stable/2.8.4/dart-core/List/List.from.html

      stateDropDownList: List<StateDropDownList>.from(json['states']);