HTTP POST method with Json on Body - Flutter/Dart HTTP POST method with Json on Body - Flutter/Dart dart dart

HTTP POST method with Json on Body - Flutter/Dart


You can copy paste run full code below
assume your response JSON string like this, it's array

[    {        "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    }]

you can parse with related class

// 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,    };}

and show ListView with

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}')),                          );                        }),                  ),

working demo

enter image description here

full code

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.    );  }}


Step 1:Create a Model class for your responsefor example

Sample JSON structure //In your response results is row

{    "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']    );

}

Step 2:

Function to get result:

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;}

Step 3:

Use FutureBuilder to display your list data

   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)));                  }              };)