【问题标题】:how to return one item and list of items in flutter如何在颤动中返回一个项目和项目列表
【发布时间】:2019-03-25 05:31:42
【问题描述】:

我构建了一个应用程序,用于从服务器返回用户信息,该信息可能包含项目或项目列表 我的问题是,当我将变量定义为列表时,它会返回项目列表,但是当我只想返回一项时会出错,当我将变量定义为地图时,它会返回一项,但返回时会出错一个列表 我该如何解决这个问题?

附:这是我的代码

import 'package:flutter/material.dart';
import 'package:idb/pages/aboutus.dart';
import 'package:idb/pages/logout.dart';
import 'package:idb/utilities/cardinfo.dart';
import 'package:idb/utilities/getTokenParameter.dart';
import 'package:date_range_picker/date_range_picker.dart' as DateRagePicker;
import 'package:idb/utilities/postRequest.dart';

String userid = '0000';

Future getUsername() async {
  var tokeninfo = await parseJwt();
  userid = tokeninfo['117115101114105100'];
}

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  List item;

  cardfoo() async {
    Map<String, dynamic> user = await getCards(userid);

    item = user['ResponseData']['data']['ROW'];

    if (mounted) {
      setState(() {
        item = user['ResponseData']['data']['ROW'];

        print('item: ${item}');
      });
    }
    return 'success';
  }

  getTransactions(
      String cardLast4digits, String dateFrom, String dateTo) async {
    var tokeninfo = await parseJwt();
    print(tokeninfo);
    print(cardLast4digits);

    String userid = tokeninfo['117115101114105100'];
    String username = tokeninfo['11711510111411097109101'];
    String url =
        'http://192.168.128.130:';

    final Map<String, dynamic> authData = {
      'Userid': userid,
      'Username': username,
      'Last4Digit': cardLast4digits,
      'DateFrom': dateFrom,
      'DateTo': dateTo,
    };

    print('befor post: ${authData}');

    Map<String, dynamic> responseData = await post(url, authData);

    print(responseData);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Home"),
        ),
        body: item == null
            ? Center(
                child: CircularProgressIndicator(),
              )
            : ListView.builder(
                itemCount: item == null ? 0 : item.length,
                scrollDirection: Axis.vertical,
                shrinkWrap: true,
                itemBuilder: (BuildContext context, int index) {
                  return new Column(
                    children: <Widget>[
                      Card(
                        margin: EdgeInsets.only(
                          top: 20,
                          left: 15,
                          right: 15,
                        ),
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(15.0),
                        ),
                        color: Colors.white70,
                        child: new Column(
                          children: <Widget>[

                            new Padding(
                                padding: new EdgeInsets.all(7.0),
                                child: new Column(
                                  children: <Widget>[
                                    new Row(children: <Widget>[
                                      new Padding(
                                        padding: new EdgeInsets.all(7.0),
                                        child: new Text('Embossed Name:',
                                            style: new TextStyle(
                                                fontSize: 15.0,
                                                color: Colors.orange)),
                                      ),
                                      new Padding(
                                        padding: new EdgeInsets.all(7.0),
                                        child: new Text(
                                            item[index]['EMBOSSED_NAME'],
                                            style:
                                                new TextStyle(fontSize: 15.0)),
                                      ),
                                    ]),


                      SizedBox(
                        height: 10,
                      ),
                      Column(
                        children: <Widget>[
                          Row(
                            children: <Widget>[
                              FlatButton.icon(
                                textColor: Colors.blue,
                                icon: Icon(
                                    Icons.calendar_today), //`Icon` to display
                                label: Text('Transctions'),

                                onPressed: () async {
                                  final List<DateTime> picked =
                                      await DateRagePicker.showDatePicker(
                                          context: context,
                                          initialFirstDate: new DateTime.now(),
                                          initialLastDate: (new DateTime.now())
                                              .add(new Duration(days: 7)),
                                          firstDate: new DateTime(2015),
                                          lastDate: new DateTime(2020));

                                  if (picked != null && picked.length == 2) {

                                    getTransactions(
                                        item[index]['CARD_NO'],
                                        picked[0].toString(),
                                        picked[1].toString());
                                  }
                                },
                              ),
                            ],
                          ),
                        ],
                      ),
                    ],
                  );
                },
              ));
  }

  @override
  void initState() {
    super.initState();
    this.cardfoo();
  }
}

错误是

Dart 错误:未处理的异常:类型“_InternalLinkedHashMap”不是类型“List”的子类型

【问题讨论】:

  • 你可以添加你正在使用的代码
  • 我编辑了我的问题 0.0 @diegoveloper
  • 如何使用: var tempVar = await .... ,然后检查 tempVar 的类型并将内容放入最终的 Map 变量中。

标签: dart flutter


【解决方案1】:

这里有一个错误:

 Map<String, dynamic> user = await getCards(userid);

那是因为getCards 返回的是 List 而不是 Map,所以尝试获取第一个元素,像这样。

  Map<String, dynamic> user = (await getCards(userid))[0];

【讨论】:

  • 实际上,错误发生在用户下方的item中,我将其定义为list,因此当返回数据包含一项时,会出现错误但是当我有一个列表时它工作正常,并且我尝试了你的代码仍然弹出相同的错误:(
  • 你能打印用户变量来检查数据吗?
  • {StatusCode: 200, StatusDescription: Cards get successfully, ResponseData: {data: {ROW: {CARD_NO: 0000, CARD_TYPE: (IQD), STATUS: VALID, EMBOSSED_NAME: IQD, BALANCE: 0000,货币:IQD,ISSUE_DATE:18-NOV-18,EXPIRE_DATE:2020/11}}}}
  • 上面是用户变量数据..其他情况变成两三个数据块
  • hmmm ,如果您将 JSON 响应从您的服务器放入会更好
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2022-11-26
  • 1970-01-01
相关资源
最近更新 更多