【问题标题】:Fetching data from Json file but map is not working从 Json 文件中获取数据但地图不起作用
【发布时间】:2020-01-13 08:52:20
【问题描述】:

我有一个列表,它正在从 JSON 文件中获取数据不是“int”类型的子类型”。 Json文件链接在这里 http://salterz.com/ukjalsa_data/directions.json

  import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:percent_indicator/percent_indicator.dart';
import 'dart:async';
import 'package:sweetalert/sweetalert.dart';

void main() => runApp(News1());
List data = [];

class News1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter",
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

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

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    fetchData();
    Timer(
        Duration(seconds: 3),
            () => Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => showdata(),
          ),
        ));
    super.initState();
  }

  void fetchData() async {
    final response =
    await http.get('http://salterz.com/ukjalsa_data/directions.json');

    if (response.statusCode == 200) {
      setState(() {
        data = json.decode(response.body);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations(
        [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);

    return Scaffold(
        body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                CircularPercentIndicator(
                    radius: 130.0,
                    animation: true,
                    progressColor: Colors.green,
                    animationDuration: 3000,
                    lineWidth: 15.0,
                    percent: 1.0,
                    center: new Text(
                      "Loading",
                      style: new TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0),
                    )),
                Text('Please wait News are Loading'),
              ],
            )));
  }
}

class showdata extends StatefulWidget {
  @override
  _showdataState createState() => _showdataState();
}

class _showdataState extends State<showdata> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: GridView.count(
          crossAxisCount: 2,
          children: data.map((TransID){
            return  Card(
              margin: EdgeInsets.all(20),
              child: InkWell(
                onTap: () {
                  print('Card tapped.');
                },
                child: Container(
                  margin: EdgeInsets.all(10),
                  width: 300,
                  height: 100,
                child: Text(data[TransID].Head),
                ),
              ),
            );
          }).toList(),
        ));
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您在解析 json 时遇到问题。我已经为它添加了一个 Data 类,现在试试吧。

        import 'dart:convert';
        import 'package:flutter/services.dart';
        import 'package:flutter/material.dart';
        import 'package:http/http.dart' as http;
        import 'package:percent_indicator/percent_indicator.dart';
        import 'dart:async';
        import 'package:sweetalert/sweetalert.dart';
    
        void main() => runApp(News1());
        List data = [];
    
        class News1 extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
            return MaterialApp(
            title: "Flutter",
            debugShowCheckedModeBanner: false,
            home: HomePage(),
            );
        }
        }
    
        class HomePage extends StatefulWidget {
        @override
        _HomePageState createState() => _HomePageState();
        }
    
        class _HomePageState extends State<HomePage> {
    
        List<Data> dataList = List();
    
        @override
        void initState() {
            fetchData();
            Timer(
                Duration(seconds: 3),
                    () => Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => showdata(),
                ),
                ));
            super.initState();
        }
    
        void fetchData() async {
            final response =
            await http.get('http://salterz.com/ukjalsa_data/directions.json');
    
            if (response.statusCode == 200) {
            setState(() {
    
                dataList.addAll(Data.fromMapList(json.decode(response.body)));
                print(dataList.length);
            });
            }
        }
    
        @override
        Widget build(BuildContext context) {
            SystemChrome.setPreferredOrientations(
                [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
    
            return Scaffold(
                body: Center(
                    child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                        CircularPercentIndicator(
                            radius: 130.0,
                            animation: true,
                            progressColor: Colors.green,
                            animationDuration: 3000,
                            lineWidth: 15.0,
                            percent: 1.0,
                            center: new Text(
                            "Loading",
                            style: new TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0),
                            )),
                        Text('Please wait News are Loading'),
                    ],
                    )));
        }
        }
    
        class showdata extends StatefulWidget {
        @override
        _showdataState createState() => _showdataState();
        }
    
        class _showdataState extends State<showdata> {
        @override
        Widget build(BuildContext context) {
            return Scaffold(
                body: GridView.count(
                crossAxisCount: 2,
                children: data.map((TransID){
                    return  Card(
                    margin: EdgeInsets.all(20),
                    child: InkWell(
                        onTap: () {
                        print('Card tapped.');
                        },
                        child: Container(
                        margin: EdgeInsets.all(10),
                        width: 300,
                        height: 100,
                        child: Text(data[TransID].Head),
                        ),
                    ),
                    );
                }).toList(),
                ));
        }
        }
    

    这是你的数据类

        class Data {
        int _transID;
        String _head;
        String _imgUrl;
        String _description;
        String _mapLink;
    
        static Data fromMap(Map<String, dynamic> map) {
            Data data = new Data();
            data._transID = map['TransID'];
            data._head = map['Head'];
            data._imgUrl = map['ImgUrl'];
            data._description = map['Description'];
            data._mapLink = map['MapLink'];
    
            return data;
        }
    
    
        static List<Data> fromMapList(dynamic mapList) {
            List<Data> list = new List(mapList.length);
            for (int i = 0; i < mapList.length; i++) {
            list[i] = fromMap(mapList[i]);
            }
            return list;
        }
        }
    

    【讨论】:

    • 看到我打印了那个列表,你会看到数组 4 的大小作为响应,现在你可以根据需要使用。
    • 非常感谢,但我不明白为什么这个列表没有显示在我的应用程序中,请帮助我
    • 您实际上想要对该列表做什么,您想在列表视图或其他任何地方显示该数据?
    • 我想在网格视图中显示它。但是知道问题已经解决了,非常感谢阿米特祝福
    猜你喜欢
    • 2023-03-09
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多