【问题标题】:How to fix the error type 'String' is not a subtype of type 'int' of 'index'?如何修复错误类型'String'不是'index'的'int'类型的子类型?
【发布时间】:2021-04-14 00:08:00
【问题描述】:

我是 Flutter 的新手,在遵循 StackOverflow 指南后,我设法找到了如何访问 json 树中值的特定部分并在地图中打印特定键的这些值。但现在我得到错误类型 'String' is not a subtype of type 'int' of 'index'

这是我的代码。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      localizationsDelegates: <LocalizationsDelegate<dynamic>>[
        DefaultMaterialLocalizations.delegate,
        DefaultWidgetsLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
      ],
      home: TransactionHistoryScreen(),
    );
  }
}

class TransactionHistoryScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      child: Scaffold(body: Container(child: MakeList(),),),
    );
  }
}

class MakeList extends StatelessWidget {
final List<Map<String, String>> json = [
  {"branch": "B1", "xyz": "0", "ABC": "2", "MN": "2"},
  {"branch": "B2", "xyz": "0", "ABC": "0", "MN": "0"},
];

@override
Widget build(BuildContext context) {
  return ListView.builder(
    itemCount: json.length,
    itemBuilder: (BuildContext context, int index) {
      return ListTileClass(jsonObject: json[index]);
    },
   );
  }
}

class ListTileClass extends StatefulWidget {
final Map<String, String> jsonObject;

ListTileClass({this.jsonObject});

@override
_ListTileClassState createState() => _ListTileClassState();
}

class _ListTileClassState extends State<ListTileClass> {
  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Container(
        child: Row(
          children: makeWidgetChildren(widget.jsonObject),
        ),
      ),
    );
  }

  List<Widget> makeWidgetChildren(jsonObject) {
    List<Widget> children = [];
    jsonObject.keys.forEach(
      (key) => {
        children.add(
          Padding(
              child: Text('${key['branch']}'), padding: EdgeInsets.all(8.0)),
        ),
      },
    );
    return children;
  }
}

请问我可以知道如何解决这个错误吗?谢谢!

【问题讨论】:

    标签: android flutter dart


    【解决方案1】:

    你正在迭代jsonObject.keys

    var keys = ["branch", "xyz", "ABC", "MN"] 
    keys.forEach((key) => print('${key['branch']}')); # A value of type 'String' can't be assigned to a variable of type 'int'.
    

    所以你正在尝试迭代字符串。

    解决t:

    Text('${jsonObject[key]}')
    

    【讨论】:

    • 感谢您的回答!当我输入Text('${jsonObject[key]}') 时,错误消失了。但是每个 json 行的所有值都会被打印出来。如何访问特定的键值对?比如branchxyz的值
    • 儿童 = [jsonObject["jsonObject"], jsonObject["xyz"] ];
    • 非常感谢它的工作!但是如果我输入 ${jsonObject['branch']} ,分支的值会打印 4 次。我认为这是因为 jsonObject 在一行中有 4 个键值对。你知道一种只打印一次 branch 值而不是打印 4 次的方法吗?非常感谢您的帮助!
    • 你到底想做什么?在ListView.builder 中,您正在遍历地图列表。如果您想打印一次,请传递地图列表并致电json[0]["jsonObject"]
    【解决方案2】:

    你的错误在这里:

    itemBuilder: (BuildContext context, int index) {
          return ListTileClass(jsonObject: json[index]);
    

    json 是地图而不是列表。所以你会通过 `json["branch"]

    调用一个元素

    不确定,解决此问题的最简单方法是什么,但使用键创建一个列表可能会有所帮助:keyList = json.keys(也许您必须稍微调整一下才能使其正常工作,而不是经过测试)。然后就可以和return ListTileClass(jsonObject: json[keyList[index]]);一起使用了

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 1970-01-01
      • 2021-05-10
      • 2022-12-13
      • 2019-04-24
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多