【问题标题】:HTTP POST method with Json on Body - Flutter/Dart主体上带有 Json 的 HTTP POST 方法 - Flutter/Dart
【发布时间】:2019-11-18 17:18:44
【问题描述】:

带有 Json 的 HTTP POST 方法 - Flutter/Dart:

 Future<List<dynamic>> requestMethodtwo() async {
    var url = "";
    var body = json.encode({"finYr": "6", "UserID": "1"});
    setState(() {
      isLoading = true;
    });
    Map<String, String> headers = {
      'Content-type': 'application/json',
      'Accept': 'application/json',
    };
    final response =
    await http.post(url, body: body, headers: headers);
    final responseJson = json.decode(response.body);
    final items = json.decode(response.body).cast<Map<String, dynamic>>();
    List<dynamic> listOfString = items.map((json) {
      return json['rows'];
    }).toList();
    print(listOf[enter image description here][1]String);
    print(response.statusCode);
    if (response.statusCode == 200) {
    }
    else {
      throw Exception('Failed to load internet');
    }
    return listOfString;
  }
My Api Call 
[
    {
        "status": 200,
        "msg": "Ok",
        "rows": [
            {
                "lid": "11031",
                "CompanyName": "WALLS ICE CREAM",
                "LeadSourceName": "Website",
                "LeadSourceValue": "ONLINE ADS"
            },
            {
               "lid": "11032",
                "CompanyName": "WALLS ICE CREAM",
                "LeadSourceName": "Website",
                "LeadSourceValue": "ONLINE ADS"
            },
            {
                 "lid": "11034",
                "CompanyName": "WALLS ICE CREAM",
                "LeadSourceName": "Website",
                "LeadSourceValue": "ONLINE ADS"
            }
        ],
        "sql": "gg",
        "reserved": null
    }
]

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。
  • 我想在列表视图中显示行数组我在响应中获取数据不知道如何在列表视图中显示。
  • @PoornaSenaniGamage 你能帮我解决这个问题吗?

标签: flutter dart


【解决方案1】:

第 1 步: 为您的响应创建一个模型类 例如

示例 JSON 结构 //在你的响应结果中是行

{
    "count": 49,
    "next": null,
    "previous": null,
    "results": [{
        "id": 4,
        "name": "PC",
        "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg"
    }]

}


class PlatformResult
{
  int count;
  String next;
  final List<Results> result;
  PlatformResult({this.count,this.next,this.result});
  factory PlatformResult.fromJson(Map<String, dynamic> json) {
    return PlatformResult(
      count: json['count'],
      next:json['next'],
      result: parseResult(json),
    );

  }
  static List<Results> parseResult(resultJson) {
    var list = resultJson['results'] as List;
    List<Results> resultsList =
    list.map((data) => Results.fromJson(data)).toList();
    return resultsList;
  }

}

class Results {
  final int id;
  final String name;
  final String image_background;
  Results({this.id, this.name,this.image_background});
  factory Results.fromJson(Map<String, dynamic> parsedJson) {
    return Results(id: parsedJson['id'], name: parsedJson['name'],image_background:parsedJson['image_background']

    );

}

第 2 步:

获取结果的函数:

PlatformResult platformResult;
getData(BuildContext context) async {
  var res = await http
      .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
  print(res.body);
  if (res.statusCode == 200) {
    print(res.body);
    platformResult = PlatformResult.fromJson(json.decode(res.body));
  }
  return  platformResult;
}

第 3 步:

使用 FutureBuilder 显示您的列表数据

   FutureBuilder(
            future:   getData(context),
            builder: (BuildContext context,AsyncSnapshot  platformData)
              {
               if (platformData.hasData != null) {
                    return ListView.builder(
                      shrinkWrap: true,
                      itemCount: platformData==null?0:   platformResult.result.length,
                      itemBuilder: (context, index) {
                        return Card(
                          child: Container(
                            child: Column(children: <Widget>[
                               Text('${platformResult.result[index].name}'),
                              new Container(
                                  width: 190.0,
                                  height: 190.0,
                                  decoration: new BoxDecoration(
                                      shape: BoxShape.circle,
                                      image: new DecorationImage(
                                          fit: BoxFit.fill,
                                          image: new NetworkImage(

                                            platformResult.result[index].image_background,
                                          )
                                      )
                                  )),

                            ],),

                          ),

                        );
                      },
                    );
                  }
                  else {

                    return Center(child: CircularProgressIndicator(
                        valueColor: AlwaysStoppedAnimation<Color>(
                            Colors.green)));
                  }

              };)

【讨论】:

    【解决方案2】:

    您可以在下面复制粘贴运行完整代码
    假设您的响应 JSON 字符串是这样的,它是数组

    [
        {
            "status": 200,
            "msg": "Ok",
            "rows": [
                {
                    "lid": "11031",
                    "CompanyName": "WALLS ICE CREAM",
                    "LeadSourceName": "Website",
                    "LeadSourceValue": "ONLINE ADS"
                },
                {
                   "lid": "11032",
                    "CompanyName": "WALLS ICE CREAM",
                    "LeadSourceName": "Website",
                    "LeadSourceValue": "ONLINE ADS"
                },
                {
                     "lid": "11034",
                    "CompanyName": "WALLS ICE CREAM",
                    "LeadSourceName": "Website",
                    "LeadSourceValue": "ONLINE ADS"
                }
            ],
            "sql": "gg",
            "reserved": null
        }
    ]
    

    你可以用相关的类来解析

    // To parse this JSON data, do
    //
    //     final payload = payloadFromJson(jsonString);
    
    import 'dart:convert';
    
    List<Payload> payloadFromJson(String str) => List<Payload>.from(json.decode(str).map((x) => Payload.fromJson(x)));
    
    String payloadToJson(List<Payload> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
    
    class Payload {
        int status;
        String msg;
        List<Row> rows;
        String sql;
        dynamic reserved;
    
        Payload({
            this.status,
            this.msg,
            this.rows,
            this.sql,
            this.reserved,
        });
    
        factory Payload.fromJson(Map<String, dynamic> json) => Payload(
            status: json["status"],
            msg: json["msg"],
            rows: List<Row>.from(json["rows"].map((x) => Row.fromJson(x))),
            sql: json["sql"],
            reserved: json["reserved"],
        );
    
        Map<String, dynamic> toJson() => {
            "status": status,
            "msg": msg,
            "rows": List<dynamic>.from(rows.map((x) => x.toJson())),
            "sql": sql,
            "reserved": reserved,
        };
    }
    
    class Row {
        String lid;
        String companyName;
        String leadSourceName;
        String leadSourceValue;
    
        Row({
            this.lid,
            this.companyName,
            this.leadSourceName,
            this.leadSourceValue,
        });
    
        factory Row.fromJson(Map<String, dynamic> json) => Row(
            lid: json["lid"],
            companyName: json["CompanyName"],
            leadSourceName: json["LeadSourceName"],
            leadSourceValue: json["LeadSourceValue"],
        );
    
        Map<String, dynamic> toJson() => {
            "lid": lid,
            "CompanyName": companyName,
            "LeadSourceName": leadSourceName,
            "LeadSourceValue": leadSourceValue,
        };
    }
    

    并显示 ListView

    loading == true
                    ? CircularProgressIndicator()
                    : Expanded(
                        flex: 1,
                        child: ListView.builder(
                            padding: const EdgeInsets.all(8),
                            itemCount: payloadList == null ? 0 : payloadList[0].rows.length,
                            itemBuilder: (BuildContext context, int index) {
                              return Container(
                                height: 50,
                                child: Center(
                                    child: Text(
                                        'lid ${payloadList[0].rows[index].lid}')),
                              );
                            }),
                      ),
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    // To parse this JSON data, do
    //
    //     final payload = payloadFromJson(jsonString);
    
    import 'dart:convert';
    
    List<Payload> payloadFromJson(String str) =>
        List<Payload>.from(json.decode(str).map((x) => Payload.fromJson(x)));
    
    String payloadToJson(List<Payload> data) =>
        json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
    
    class Payload {
      int status;
      String msg;
      List<Row> rows;
      String sql;
      dynamic reserved;
    
      Payload({
        this.status,
        this.msg,
        this.rows,
        this.sql,
        this.reserved,
      });
    
      factory Payload.fromJson(Map<String, dynamic> json) => Payload(
            status: json["status"],
            msg: json["msg"],
            rows: List<Row>.from(json["rows"].map((x) => Row.fromJson(x))),
            sql: json["sql"],
            reserved: json["reserved"],
          );
    
      Map<String, dynamic> toJson() => {
            "status": status,
            "msg": msg,
            "rows": List<dynamic>.from(rows.map((x) => x.toJson())),
            "sql": sql,
            "reserved": reserved,
          };
    }
    
    class Row {
      String lid;
      String companyName;
      String leadSourceName;
      String leadSourceValue;
    
      Row({
        this.lid,
        this.companyName,
        this.leadSourceName,
        this.leadSourceValue,
      });
    
      factory Row.fromJson(Map<String, dynamic> json) => Row(
            lid: json["lid"],
            companyName: json["CompanyName"],
            leadSourceName: json["LeadSourceName"],
            leadSourceValue: json["LeadSourceValue"],
          );
    
      Map<String, dynamic> toJson() => {
            "lid": lid,
            "CompanyName": companyName,
            "LeadSourceName": leadSourceName,
            "LeadSourceValue": leadSourceValue,
          };
    }
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            // This is the theme of your application.
            //
            // Try running your application with "flutter run". You'll see the
            // application has a blue toolbar. Then, without quitting the app, try
            // changing the primarySwatch below to Colors.green and then invoke
            // "hot reload" (press "r" in the console where you ran "flutter run",
            // or simply save your changes to "hot reload" in a Flutter IDE).
            // Notice that the counter didn't reset back to zero; the application
            // is not restarted.
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      // This widget is the home page of your application. It is stateful, meaning
      // that it has a State object (defined below) that contains fields that affect
      // how it looks.
    
      // This class is the configuration for the state. It holds the values (in this
      // case the title) provided by the parent (in this case the App widget) and
      // used by the build method of the State. Fields in a Widget subclass are
      // always marked "final".
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
      List<Payload> payloadList;
      bool loading = false;
      String jsonString = '''
      [
        {
            "status": 200,
            "msg": "Ok",
            "rows": [
                {
                    "lid": "11031",
                    "CompanyName": "WALLS ICE CREAM",
                    "LeadSourceName": "Website",
                    "LeadSourceValue": "ONLINE ADS"
                },
                {
                   "lid": "11032",
                    "CompanyName": "WALLS ICE CREAM",
                    "LeadSourceName": "Website",
                    "LeadSourceValue": "ONLINE ADS"
                },
                {
                     "lid": "11034",
                    "CompanyName": "WALLS ICE CREAM",
                    "LeadSourceName": "Website",
                    "LeadSourceValue": "ONLINE ADS"
                }
            ],
            "sql": "gg",
            "reserved": null
        }
    ]
      ''';
    
      void _incrementCounter() {
        setState(() {
          loading = true;
          payloadList = payloadFromJson(jsonString);
          loading = false;
          // This call to setState tells the Flutter framework that something has
          // changed in this State, which causes it to rerun the build method below
          // so that the display can reflect the updated values. If we changed
          // _counter without calling setState(), then the build method would not be
          // called again, and so nothing would appear to happen.
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        // This method is rerun every time setState is called, for instance as done
        // by the _incrementCounter method above.
        //
        // The Flutter framework has been optimized to make rerunning build methods
        // fast, so that you can just rebuild anything that needs updating rather
        // than having to individually change instances of widgets.
        return Scaffold(
          appBar: AppBar(
            // Here we take the value from the MyHomePage object that was created by
            // the App.build method, and use it to set our appbar title.
            title: Text(widget.title),
          ),
          body: Center(
            // Center is a layout widget. It takes a single child and positions it
            // in the middle of the parent.
            child: Column(
              // Column is also a layout widget. It takes a list of children and
              // arranges them vertically. By default, it sizes itself to fit its
              // children horizontally, and tries to be as tall as its parent.
              //
              // Invoke "debug painting" (press "p" in the console, choose the
              // "Toggle Debug Paint" action from the Flutter Inspector in Android
              // Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
              // to see the wireframe for each widget.
              //
              // Column has various properties to control how it sizes itself and
              // how it positions its children. Here we use mainAxisAlignment to
              // center the children vertically; the main axis here is the vertical
              // axis because Columns are vertical (the cross axis would be
              // horizontal).
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                loading == true
                    ? CircularProgressIndicator()
                    : Expanded(
                        flex: 1,
                        child: ListView.builder(
                            padding: const EdgeInsets.all(8),
                            itemCount: payloadList == null ? 0 : payloadList[0].rows.length,
                            itemBuilder: (BuildContext context, int index) {
                              return Container(
                                height: 50,
                                child: Center(
                                    child: Text(
                                        'lid ${payloadList[0].rows[index].lid}')),
                              );
                            }),
                      ),
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ), // This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    }
    

    【讨论】:

    • @Changchun 你能帮忙完成这个异步任务吗?上面的代码正在工作,但我需要使用 post http 方法传递它....在其中我收到错误。错误:未处理的异常:类型 'List' 不是类型 'String' 的子类型跨度>
    • 使用我的代码,您可以使用 payloadList = payloadFromJson(jsonString); 解析 json 字符串;并返回 Future>
    • 未来> requestMethodtwo() async { var url = ""; var body = json.encode({"finYr": "6", "UserID": "1"}); Map headers = { 'Content-type': 'application/json', 'Accept': 'application/json', };最终响应 = 等待 http.post(url, body: body, headers: headers);最终 responseJson = json.decode(response.body); setState(() { payloadList = payloadFromJson(responseJson); });返回响应Json; }
    • @Changchun 仍然给出同样的错误是我的异步函数是 ryt 吗?
    • 未来> requestMethodtwo() async { var url = ""; var body = json.encode({"finYr": "6", "UserID": "1"}); Map headers = { 'Content-type': 'application/json', 'Accept': 'application/json', };最终响应 = 等待 http.post(url, body: body, headers: headers); setState(() { payloadList = payloadFromJson(response.body); });返回有效载荷列表; }
    猜你喜欢
    • 2018-10-21
    • 2019-07-03
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多