在每一个类中使用json值与颤振?

在每一个类中使用json值与颤振?,json,flutter,Json,Flutter,我正在尝试制作一个应用程序,该应用程序将根据服务器上的json文件定制小部件,因此,我可以通过简单的设计使用我的第一个代码来实现这一点,但在尝试制作另一个设计(如底部栏)后,我无法在任何类中使用我的数据,因为我无法理解异步的逻辑,或者我认为我应该在每个小部件中使用futurebuilder,但我不明白如何使用。。 首先;是否有必要首先获取数据,并在每个带有flifter的小部件中使用这些映射数据,或者我的示例的最佳答案是什么 无需设计的工作代码 import 'dart:async'; impo

我正在尝试制作一个应用程序,该应用程序将根据服务器上的json文件定制小部件,因此,我可以通过简单的设计使用我的第一个代码来实现这一点,但在尝试制作另一个设计(如底部栏)后,我无法在任何类中使用我的数据,因为我无法理解异步的逻辑,或者我认为我应该在每个小部件中使用futurebuilder,但我不明白如何使用。。 首先;是否有必要首先获取数据,并在每个带有flifter的小部件中使用这些映射数据,或者我的示例的最佳答案是什么

无需设计的工作代码

import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';

void main() async{

  Map data = await getData();
  // String myData = data[0]['title'];
  runApp(new MaterialApp(
    title: 'Random Movie',
    home: new Scaffold(
      backgroundColor: Colors.black54,
      appBar: AppBar(
        centerTitle: true,
        backgroundColor: Colors.blueGrey,
        title: new Text('${data['movietitle']}',
            maxLines: 2,
        ),
      ),
      body: new Container(
        margin: EdgeInsets.only(left: 22.0),
        child: new Column(
          children: <Widget>[
            new Padding(padding: EdgeInsets.only(top: 15.0)),

            new Center(
              child:
              Image.network(data['movieposterurl'],
                height: 300,
                fit:BoxFit.fill
              )
            ),

            new Padding(padding: EdgeInsets.only(top: 50.0)),
            new Text('Director: ${data['moviedirectors']}',

              style: TextStyle(

                color: Colors.white,
                fontSize: 20.0,
              ),
            ),
            new Text('Genres: ${data['moviegenre']}',

              style: TextStyle(

                color: Colors.white,
                fontSize: 18.0,
              ),
            ),
            new Text('Year: ${data['movieyear']}',

              style: TextStyle(

                color: Colors.white,
                fontSize: 18.0,
              ),
            ),
            new Text('Rating: ${data['movierating']}',

              style: TextStyle(

                color: Colors.white,
                fontSize: 18.0,
              ),
            ),
            new Text('Runtime: ${data['movieruntime']}',
              style: TextStyle(
                color: Colors.white,
                fontSize: 18.0,
              ),
            ),
          ],
        ),
      ),
    ),
  ));
}

Future<Map> getData() async{
  String myUrl = 'http://127.0.0.1/query?username=username';
  http.Response response = await http.get(myUrl);
  return json.decode(response.body);
}
带有url的最终版本

import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
// To parse this JSON data, do
// final payload = payloadFromJson(jsonString);

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  String moviecast;
  String moviedirectors;
  String moviegenre;
  String movieposterurl;
  String movierating;
  String movieruntime;
  String moviesummary;
  String movietitle;
  String moviewriters;
  String movieyear;

  Payload({
    this.moviecast,
    this.moviedirectors,
    this.moviegenre,
    this.movieposterurl,
    this.movierating,
    this.movieruntime,
    this.moviesummary,
    this.movietitle,
    this.moviewriters,
    this.movieyear,
  });

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
    moviecast: json["moviecast"],
    moviedirectors: json["moviedirectors"],
    moviegenre: json["moviegenre"],
    movieposterurl: json["movieposterurl"],
    movierating: json["movierating"],
    movieruntime: json["movieruntime"],
    moviesummary: json["moviesummary"],
    movietitle: json["movietitle"],
    moviewriters: json["moviewriters"],
    movieyear: json["movieyear"],
  );

  Map<String, dynamic> toJson() => {
    "moviecast": moviecast,
    "moviedirectors": moviedirectors,
    "moviegenre": moviegenre,
    "movieposterurl": movieposterurl,
    "movierating": movierating,
    "movieruntime": movieruntime,
    "moviesummary": moviesummary,
    "movietitle": movietitle,
    "moviewriters": moviewriters,
    "movieyear": movieyear,
  };
}


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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Random Movie',
      theme: ThemeData(
        primarySwatch: Colors.grey,
      ),
      home: MyHomePage(title: "Data from json"),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

Payload payload;

class _MyHomePageState extends State<MyHomePage> {
  Modal modal = Modal();
  bool isLoading = true;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      loadData();
    });
  }

  void loadData() async {
    payload = await getData();
    isLoading = false;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(' ${payload.moviecast}'),
          ],
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              onPressed: () {
                modal.mainBottomSheet(context);
              },
              child: Text('Data from json'),
            ),
          ],
        ),
      ),
    );
  }
}

Future<Payload> getData() async {
  String myUrl = 'https://5f0af955.ngrok.io/query?username=lunedor';
  http.Response response = await http.get(myUrl);
  return json.decode(response.body); 
}
//await Future.delayed(const Duration(seconds: 5), () {});

class Modal {
  mainBottomSheet(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              _createTile(
                  context, payload.moviedirectors, Icons.message, _action1),
              _createTile(
                  context, payload.movierating, Icons.camera_alt, _action2),
              _createTile(
                  context, payload.movietitle, Icons.photo_library, _action3),
            ],
          );
        });
  }

  ListTile _createTile(
      BuildContext context, String name, IconData icon, Function action) {
    return ListTile(
      leading: Icon(icon),
      title: Text(name),
      onTap: () {
        Navigator.pop(context);
        action();
      },
    );
  }

  _action1() {
    print('action 1');
  }

  _action2() {
    print('action 2');
  }

  _action3() {
    print('action 3');
  }
}

您可以复制粘贴运行下面的完整代码 您可以使用addPostFrameCallback并设置bool isLoading 当isLoading为true时,返回CircularProgressIndicator

工作演示

完整代码

import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
// To parse this JSON data, do
//
//     final payload = payloadFromJson(jsonString);

import 'dart:convert';

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  String moviecast;
  String moviedirectors;
  String moviegenre;
  String movieposterurl;
  String movierating;
  String movieruntime;
  String moviesummary;
  String movietitle;
  String moviewriters;
  String movieyear;

  Payload({
    this.moviecast,
    this.moviedirectors,
    this.moviegenre,
    this.movieposterurl,
    this.movierating,
    this.movieruntime,
    this.moviesummary,
    this.movietitle,
    this.moviewriters,
    this.movieyear,
  });

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
        moviecast: json["moviecast"],
        moviedirectors: json["moviedirectors"],
        moviegenre: json["moviegenre"],
        movieposterurl: json["movieposterurl"],
        movierating: json["movierating"],
        movieruntime: json["movieruntime"],
        moviesummary: json["moviesummary"],
        movietitle: json["movietitle"],
        moviewriters: json["moviewriters"],
        movieyear: json["movieyear"],
      );

  Map<String, dynamic> toJson() => {
        "moviecast": moviecast,
        "moviedirectors": moviedirectors,
        "moviegenre": moviegenre,
        "movieposterurl": movieposterurl,
        "movierating": movierating,
        "movieruntime": movieruntime,
        "moviesummary": moviesummary,
        "movietitle": movietitle,
        "moviewriters": moviewriters,
        "movieyear": movieyear,
      };
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Random Movie',
      theme: ThemeData(
        primarySwatch: Colors.grey,
      ),
      home: MyHomePage(title: "Data from json"),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

Payload payload;

class _MyHomePageState extends State<MyHomePage> {
  Modal modal = Modal();
  bool isLoading = true;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      loadData();
    });
  }

  void loadData() async {
    payload = await getData();
    isLoading = false;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(' ${payload.moviecast}'),
                ],
              ),
            ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              onPressed: () {
                modal.mainBottomSheet(context);
              },
              child: Text('Data from json'),
            ),
          ],
        ),
      ),
    );
  }
}

Future<Payload> getData() async {
  /*String myUrl = 'http://127.0.0.1/query?username=username';
  http.Response response = await http.get(myUrl);
  return json.decode(response.body);*/
  await Future.delayed(const Duration(seconds: 5), () {});

  String jsonString = '''
  {
  "moviecast": "Michael Shannon, Jessica Chastain, Tova Stewart, Shea Whigham, Katy Mixon, Natasha Randall, Ron Kennard, Scott Knisley, Robert Longstreet, Heather Caldwell, Sheila Hullihen, John Kloock, Marianna Alacchi, Jacque Jovic, Bob Maines, Charles Moore, Pete Ferry, Molly McGinnis, Angie Marino-Smith, Isabelle Smith, Tina Stump, Ken Strunk, Maryanne Nagel, Hailee Dickens, Kathy Baker, Guy Van Swearingen, LisaGay Hamilton, William Alexander, Joanna Tyler, Stuart Greer, Ray McKinnon, Jake Lockwood, Kim Hendrickson, Bart Flynn, Nick Koesters, Jeffrey Grover, Qenny O.T. Vitosha, Jason Botsford, Luis Orozco, Joe Zamora",
  "moviedirectors": "Jeff Nichols",
  "moviegenre": "Drama, Horror, Thriller",
  "movieposterurl": "https://m.media-amazon.com/images/M/MV5BNzgzODA5MTU3MF5BMl5BanBnXkFtZTcwODY4MDEwNg@@.jpg",
  "movierating": "7.4",
  "movieruntime": "121",
  "moviesummary": "Curtis, a father and husband, is starting to experience bad dreams and hallucinations. Assuming mental illness, he seeks medical help and counseling. However, fearing the worst, he starts building an elaborate and expensive storm shelter in their backyard. This storm shelter threatens to tear apart his family, threatens his sanity and his standing in the community, but he builds it to save his family's life.",
  "movietitle": "Take Shelter",
  "moviewriters": "Jeff Nichols",
  "movieyear": "2011"
}
  ''';

  return payloadFromJson(jsonString);
}

class Modal {
  mainBottomSheet(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              _createTile(
                  context, payload.moviedirectors, Icons.message, _action1),
              _createTile(
                  context, payload.movierating, Icons.camera_alt, _action2),
              _createTile(
                  context, payload.movietitle, Icons.photo_library, _action3),
            ],
          );
        });
  }

  ListTile _createTile(
      BuildContext context, String name, IconData icon, Function action) {
    return ListTile(
      leading: Icon(icon),
      title: Text(name),
      onTap: () {
        Navigator.pop(context);
        action();
      },
    );
  }

  _action1() {
    print('action 1');
  }

  _action2() {
    print('action 2');
  }

  _action3() {
    print('action 3');
  }
}

非常感谢您的努力,我可以使用您的json示例,但当我尝试从我的url获取数据时,它会一直等待数据,我检查了服务器端,它得到了200个代码,这意味着成功,我想我在删除您的注释时犯了一些错误,我删除了您的json示例,然后取消了注释/*字符串myUrl=;……*/然后等待未来。延迟常数持续时间秒:5,{};行变得无用,所以我删除了它,同样当我取消注释final payload=payloadFromJsonjsonString;然后出现错误,比如它被多次使用。我添加了最终版本,如果您可以检查的话,我可以通过一个工作url理解,仅供参考url每8小时变为非活动状态,但我会在它脱机时更新新url,它现在必须工作。请删除并返回json.decoderess.body;并使用jsonresponse.body返回的payloadFromJsonresponse;因为您需要返回一个有效负载实例。所以你需要再次使用JsonTanks的PayloadFromJSonTanks,现在一切都好了。最后一个问题,当我厌倦了:home:MyHomePagetitle:“${payload.movietitle}”时,有没有可能将movietitle添加到appbar标题中,它说movietitle是在null上调用的
// 20200309181659
// http://127.0.0.1:5000/query?username=username

{
  "moviecast": "Michael Shannon, Jessica Chastain, Tova Stewart, Shea Whigham, Katy Mixon, Natasha Randall, Ron Kennard, Scott Knisley, Robert Longstreet, Heather Caldwell, Sheila Hullihen, John Kloock, Marianna Alacchi, Jacque Jovic, Bob Maines, Charles Moore, Pete Ferry, Molly McGinnis, Angie Marino-Smith, Isabelle Smith, Tina Stump, Ken Strunk, Maryanne Nagel, Hailee Dickens, Kathy Baker, Guy Van Swearingen, LisaGay Hamilton, William Alexander, Joanna Tyler, Stuart Greer, Ray McKinnon, Jake Lockwood, Kim Hendrickson, Bart Flynn, Nick Koesters, Jeffrey Grover, Qenny O.T. Vitosha, Jason Botsford, Luis Orozco, Joe Zamora",
  "moviedirectors": "Jeff Nichols",
  "moviegenre": "Drama, Horror, Thriller",
  "movieposterurl": "https://m.media-amazon.com/images/M/MV5BNzgzODA5MTU3MF5BMl5BanBnXkFtZTcwODY4MDEwNg@@.jpg",
  "movierating": "7.4",
  "movieruntime": "121",
  "moviesummary": "Curtis, a father and husband, is starting to experience bad dreams and hallucinations. Assuming mental illness, he seeks medical help and counseling. However, fearing the worst, he starts building an elaborate and expensive storm shelter in their backyard. This storm shelter threatens to tear apart his family, threatens his sanity and his standing in the community, but he builds it to save his family's life.",
  "movietitle": "Take Shelter",
  "moviewriters": "Jeff Nichols",
  "movieyear": "2011"
}
import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
// To parse this JSON data, do
// final payload = payloadFromJson(jsonString);

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  String moviecast;
  String moviedirectors;
  String moviegenre;
  String movieposterurl;
  String movierating;
  String movieruntime;
  String moviesummary;
  String movietitle;
  String moviewriters;
  String movieyear;

  Payload({
    this.moviecast,
    this.moviedirectors,
    this.moviegenre,
    this.movieposterurl,
    this.movierating,
    this.movieruntime,
    this.moviesummary,
    this.movietitle,
    this.moviewriters,
    this.movieyear,
  });

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
    moviecast: json["moviecast"],
    moviedirectors: json["moviedirectors"],
    moviegenre: json["moviegenre"],
    movieposterurl: json["movieposterurl"],
    movierating: json["movierating"],
    movieruntime: json["movieruntime"],
    moviesummary: json["moviesummary"],
    movietitle: json["movietitle"],
    moviewriters: json["moviewriters"],
    movieyear: json["movieyear"],
  );

  Map<String, dynamic> toJson() => {
    "moviecast": moviecast,
    "moviedirectors": moviedirectors,
    "moviegenre": moviegenre,
    "movieposterurl": movieposterurl,
    "movierating": movierating,
    "movieruntime": movieruntime,
    "moviesummary": moviesummary,
    "movietitle": movietitle,
    "moviewriters": moviewriters,
    "movieyear": movieyear,
  };
}


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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Random Movie',
      theme: ThemeData(
        primarySwatch: Colors.grey,
      ),
      home: MyHomePage(title: "Data from json"),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

Payload payload;

class _MyHomePageState extends State<MyHomePage> {
  Modal modal = Modal();
  bool isLoading = true;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      loadData();
    });
  }

  void loadData() async {
    payload = await getData();
    isLoading = false;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(' ${payload.moviecast}'),
          ],
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              onPressed: () {
                modal.mainBottomSheet(context);
              },
              child: Text('Data from json'),
            ),
          ],
        ),
      ),
    );
  }
}

Future<Payload> getData() async {
  String myUrl = 'https://5f0af955.ngrok.io/query?username=lunedor';
  http.Response response = await http.get(myUrl);
  return json.decode(response.body); 
}
//await Future.delayed(const Duration(seconds: 5), () {});

class Modal {
  mainBottomSheet(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              _createTile(
                  context, payload.moviedirectors, Icons.message, _action1),
              _createTile(
                  context, payload.movierating, Icons.camera_alt, _action2),
              _createTile(
                  context, payload.movietitle, Icons.photo_library, _action3),
            ],
          );
        });
  }

  ListTile _createTile(
      BuildContext context, String name, IconData icon, Function action) {
    return ListTile(
      leading: Icon(icon),
      title: Text(name),
      onTap: () {
        Navigator.pop(context);
        action();
      },
    );
  }

  _action1() {
    print('action 1');
  }

  _action2() {
    print('action 2');
  }

  _action3() {
    print('action 3');
  }
}
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      loadData();
    });
  }

  void loadData() async {
    payload = await getData();
    isLoading = false;
    setState(() {});
  }
  ...
  body: isLoading
          ? CircularProgressIndicator()
          : Center(
import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
// To parse this JSON data, do
//
//     final payload = payloadFromJson(jsonString);

import 'dart:convert';

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  String moviecast;
  String moviedirectors;
  String moviegenre;
  String movieposterurl;
  String movierating;
  String movieruntime;
  String moviesummary;
  String movietitle;
  String moviewriters;
  String movieyear;

  Payload({
    this.moviecast,
    this.moviedirectors,
    this.moviegenre,
    this.movieposterurl,
    this.movierating,
    this.movieruntime,
    this.moviesummary,
    this.movietitle,
    this.moviewriters,
    this.movieyear,
  });

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
        moviecast: json["moviecast"],
        moviedirectors: json["moviedirectors"],
        moviegenre: json["moviegenre"],
        movieposterurl: json["movieposterurl"],
        movierating: json["movierating"],
        movieruntime: json["movieruntime"],
        moviesummary: json["moviesummary"],
        movietitle: json["movietitle"],
        moviewriters: json["moviewriters"],
        movieyear: json["movieyear"],
      );

  Map<String, dynamic> toJson() => {
        "moviecast": moviecast,
        "moviedirectors": moviedirectors,
        "moviegenre": moviegenre,
        "movieposterurl": movieposterurl,
        "movierating": movierating,
        "movieruntime": movieruntime,
        "moviesummary": moviesummary,
        "movietitle": movietitle,
        "moviewriters": moviewriters,
        "movieyear": movieyear,
      };
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Random Movie',
      theme: ThemeData(
        primarySwatch: Colors.grey,
      ),
      home: MyHomePage(title: "Data from json"),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

Payload payload;

class _MyHomePageState extends State<MyHomePage> {
  Modal modal = Modal();
  bool isLoading = true;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      loadData();
    });
  }

  void loadData() async {
    payload = await getData();
    isLoading = false;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(' ${payload.moviecast}'),
                ],
              ),
            ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              onPressed: () {
                modal.mainBottomSheet(context);
              },
              child: Text('Data from json'),
            ),
          ],
        ),
      ),
    );
  }
}

Future<Payload> getData() async {
  /*String myUrl = 'http://127.0.0.1/query?username=username';
  http.Response response = await http.get(myUrl);
  return json.decode(response.body);*/
  await Future.delayed(const Duration(seconds: 5), () {});

  String jsonString = '''
  {
  "moviecast": "Michael Shannon, Jessica Chastain, Tova Stewart, Shea Whigham, Katy Mixon, Natasha Randall, Ron Kennard, Scott Knisley, Robert Longstreet, Heather Caldwell, Sheila Hullihen, John Kloock, Marianna Alacchi, Jacque Jovic, Bob Maines, Charles Moore, Pete Ferry, Molly McGinnis, Angie Marino-Smith, Isabelle Smith, Tina Stump, Ken Strunk, Maryanne Nagel, Hailee Dickens, Kathy Baker, Guy Van Swearingen, LisaGay Hamilton, William Alexander, Joanna Tyler, Stuart Greer, Ray McKinnon, Jake Lockwood, Kim Hendrickson, Bart Flynn, Nick Koesters, Jeffrey Grover, Qenny O.T. Vitosha, Jason Botsford, Luis Orozco, Joe Zamora",
  "moviedirectors": "Jeff Nichols",
  "moviegenre": "Drama, Horror, Thriller",
  "movieposterurl": "https://m.media-amazon.com/images/M/MV5BNzgzODA5MTU3MF5BMl5BanBnXkFtZTcwODY4MDEwNg@@.jpg",
  "movierating": "7.4",
  "movieruntime": "121",
  "moviesummary": "Curtis, a father and husband, is starting to experience bad dreams and hallucinations. Assuming mental illness, he seeks medical help and counseling. However, fearing the worst, he starts building an elaborate and expensive storm shelter in their backyard. This storm shelter threatens to tear apart his family, threatens his sanity and his standing in the community, but he builds it to save his family's life.",
  "movietitle": "Take Shelter",
  "moviewriters": "Jeff Nichols",
  "movieyear": "2011"
}
  ''';

  return payloadFromJson(jsonString);
}

class Modal {
  mainBottomSheet(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              _createTile(
                  context, payload.moviedirectors, Icons.message, _action1),
              _createTile(
                  context, payload.movierating, Icons.camera_alt, _action2),
              _createTile(
                  context, payload.movietitle, Icons.photo_library, _action3),
            ],
          );
        });
  }

  ListTile _createTile(
      BuildContext context, String name, IconData icon, Function action) {
    return ListTile(
      leading: Icon(icon),
      title: Text(name),
      onTap: () {
        Navigator.pop(context);
        action();
      },
    );
  }

  _action1() {
    print('action 1');
  }

  _action2() {
    print('action 2');
  }

  _action3() {
    print('action 3');
  }
}