【问题标题】:Flutter List<String> JSON into a WidgetFlutter List<String> JSON 到 Widget
【发布时间】:2018-09-03 09:38:57
【问题描述】:

我在资产文件夹中有一个 JSON 文件

States.json

{
  "name" : "State List",
  "states" : [
   "Johor",
    "Kedah",
    "Kelantan",
    "Kuala Lumpur",
    "Melaka",
    "Negeri Sembilan",
    "Pulau Pinang",
    "Perak",
    "Perlis",
    "Pahang",
    "Terengganu",
    "Sabah",
    "Sarawak",
    "Selangor",
    "Wilayah Persekutuan"
  ]
}

我为各州制作了一个模型类:

state_model.dart

class States{

  String name;
  List<String> states;

  States({this.name, this.states});

  factory States.fromJson(Map<String, dynamic> json){

    var statesJson = json["states"];
    List<String> stateList = new List<String>.from(statesJson);

    return States(
      name: json["name"],
      states: stateList
    );
  }
}

这是 ma​​in.dart 文件:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'dart:async' show Future;
import 'dart:convert';
import 'package:state_json/model/state_model.dart';

//get the assets
Future<String> loadAssets() async{
  return await rootBundle.loadString('assets/states.json');
}

//get the states from the assets
Future loadStates() async{
  String jsonState =  await loadAssets();
  final jsonResponse = json.decode(jsonState);

  States states = new States.fromJson(jsonResponse);
  print(states.states);
  return states.states;
}

void main() {
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  MyAppState createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        home: new Scaffold(
          appBar: new AppBar(
              title: new Text("States JSON")
          ),
            body: new FutureBuilder(
                future: loadStates(),
                builder: (context, snapshot){
                  if(snapshot.hasData){
                    return new ListView.builder(
                        itemBuilder: (context, index){
                          new ListTile(
                            title: new Text("${snapshot.data}"),
                          );
                        });
                  }else{
                    return new Center(child: new CircularProgressIndicator());
                  }
                })
        )
    );
  }
}

我目前面临的问题是,我可以在终端打印出字符串的值就好了。

I/flutter (16482): [Johor, Kedah, Kelantan, Kuala Lumpur, Melaka, Negeri Sembilan, Pulau Pinang, Perak, Perlis, Pahang, Terengganu, Sabah, Sarawak, Selangor, Wilayah Persekutuan]

但我不知道我应该如何将值插入 FutureBuilder.builder,它进入 ListView.builder,然后进入 ListTile 以显示状态列表。

非常感谢任何帮助。

【问题讨论】:

  • 你在问什么,你的futurebuilder已经设置好了有什么问题?
  • @aziza 我的问题是futurebuilder里面的listtile没有显示任何东西。我应该在 listtile 中放什么?

标签: json dart flutter


【解决方案1】:

为了简化@Letsar 的回答:

我们也可以将itemCount参数传递给ListView.builder来指定列表中的元素个数,而不是返回null来将索引标记为不适用。示例如下:

return new ListView.builder(
    itemCount: snapshot?.data?.length,
    itemBuilder: (context, index) {
        return new ListTile(
          title: new Text("${snapshot.data[index]}"),
        );
    }
);

【讨论】:

  • 这个答案是另一种选择。将考虑在即将到来的项目中使用它。谢谢。我学到了很多。
【解决方案2】:

这里可能有两个问题:

  1. itemBuilder 中没有 return 语句。所以它返回 null
  2. loadStates() 的返回类型是Future。我认为它 应该是Future&lt;List&lt;String&gt;&gt;

然后就可以通过索引访问数据了:

return new ListView.builder(
  itemBuilder: (context, index){
    if(index >= snapshot?.data?.length ?? 0) return null;

    return new ListTile(
      title: new Text("${snapshot.data[index]}"),
    );
});

注意:我没有测试代码。

【讨论】:

  • 我很确定这个答案有效,但我不确定如何正确编写我的 Future 方法。我试着写 Future> 但它仍然显示一个空白页。
  • 更新:我只是在 ListView.builder 下打错了一些东西,现在它工作得很好。谢谢。
  • @AsyrafDayan 无需修改 loadStates() 的返回类型即可正常工作。我猜类型推断会处理它..
猜你喜欢
  • 2020-05-25
  • 2021-12-19
  • 2021-12-20
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多