美文网首页Flutter
Flutter Http with List

Flutter Http with List

作者: Air_w | 来源:发表于2019-07-08 16:36 被阅读1125次

Flutter Http and Async Await and List



本篇汇集:网络交互、数据解析、列表展示、对话框显示、列表加载等待的显示

目录:
1、Flutter http using
2、JSON
3、ListView
4、ListView- loading status
5、ListView- Item and item event
6、本篇汇总的效果

1、Flutter http using

依赖:在pubspec.yaml文件中添加Flutter网路模块的依赖

dependencies:
  ...
  http: ^0.11.3+16

网络操作


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

  loadData() async {
    String dataURL = "https://jsonplaceholder.typicode.com/posts";
    http.Response response = await http.get(dataURL);

  }
}

2、JSON

导包

import 'dart:convert';

数据解析

  List widgets = [];

    setState(() {
      widgets = json.decode(response.body);
    });

3、ListView

        body: ListView.builder(
            itemCount: getItemCount(),
            itemBuilder: (BuildContext context, int position) {
              return getItemWidget(position);
            }));

  int getItemCount() {
    if (widgets.isEmpty) {
      return 5;
    }
    return widgets.length;
  }


  Widget getItemWidget(int position) {
    if (widgets.isEmpty) {
      return getEmptyLoadingWidget();
    }
    return getRow(position);
  }

4、ListView- loading status


  Widget getEmptyLoadingWidget() {
    return Padding(
      padding: EdgeInsets.all(10.0),
      child: Card(
        child: Column(
          children: <Widget>[
            ListTile(
              leading: CircleAvatar(
                child: Text('**'),
              ),
              title: Text(
                "******",
                maxLines: 1,
                style: TextStyle(
                  color: Colors.blue,
                ),
                semanticsLabel: 'semanticsLabel',
              ),
              subtitle: Text("******"),
              trailing: Text('******'),
            ),
            Text('努力加载中...'),
          ],
        ),
      ),
    );
  }

5、ListView- Item and item event

item event

          onLongPress: () {
            if (widgets.isNotEmpty) {
              showAboutDialog(
                applicationName: "Name",
                context: context,
                children: <Widget>[
                  Text('Title:${widgets[i]["title"]}'),
                  Divider(),
                  Text('Body:${widgets[i]["body"]}'),
                ],
              );
            }
          },

item


  Widget getRow(int i) {
    return Padding(
      padding: EdgeInsets.all(10.0),
      child: Card(
        child: ListTile(
          leading: CircleAvatar(
            child: Text('${widgets[i]["id"]}'),
          ),
          title: Text(
            "Row ${widgets[i]["title"]}",
            maxLines: 1,
            style: TextStyle(
              color: Colors.blue,
            ),
            semanticsLabel: 'semanticsLabel',
          ),
          subtitle: Text("Row ${widgets[i]["body"]}"),
          trailing: Text('userId:${widgets[i]["userId"]}'),
          onTap: () {},
          onLongPress: () {
            if (widgets.isNotEmpty) {
              showAboutDialog(
                applicationName: "Name",
                context: context,
                children: <Widget>[
                  Text('Title:${widgets[i]["title"]}'),
                  Divider(),
                  Text('Body:${widgets[i]["body"]}'),
                ],
              );
            }
          },
        ),
      ),
    );
  }

6、本篇汇总的效果

Flutter-Http.gif
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class ListPage extends StatefulWidget {
  BuildContext mPreContext;
  ListPage(BuildContext preContext) {
    mPreContext = preContext;
  }
  @override
  _ListState createState() {
    // TODO: implement createState
    return _ListState();
  }
}

class _ListState extends State<ListPage> {
  List widgets = [];

  @override
  void initState() {
    super.initState();

    loadData();
  }

  int getItemCount() {
    if (widgets.isEmpty) {
      return 5;
    }
    return widgets.length;
  }

  Widget getItemWidget(int position) {
    if (widgets.isEmpty) {
      return getEmptyLoadingWidget();
    }
    return getRow(position);
  }

  Widget getEmptyLoadingWidget() {
    return Padding(
      padding: EdgeInsets.all(10.0),
      child: Card(
        child: Column(
          children: <Widget>[
            ListTile(
              leading: CircleAvatar(
                child: Text('**'),
              ),
              title: Text(
                "******",
                maxLines: 1,
                style: TextStyle(
                  color: Colors.blue,
                ),
                semanticsLabel: 'semanticsLabel',
              ),
              subtitle: Text("******"),
              trailing: Text('******'),
            ),
            Text('努力加载中...'),
          ],
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Sample HTTP"),
        ),
        body: ListView.builder(
            itemCount: getItemCount(),
            itemBuilder: (BuildContext context, int position) {
              return getItemWidget(position);
            }));
  }

  Widget getRow(int i) {
    return Padding(
      padding: EdgeInsets.all(10.0),
      child: Card(
        child: ListTile(
          leading: CircleAvatar(
            child: Text('${widgets[i]["id"]}'),
          ),
          title: Text(
            "Row ${widgets[i]["title"]}",
            maxLines: 1,
            style: TextStyle(
              color: Colors.blue,
            ),
            semanticsLabel: 'semanticsLabel',
          ),
          subtitle: Text("Row ${widgets[i]["body"]}"),
          trailing: Text('userId:${widgets[i]["userId"]}'),
          onTap: () {},
          onLongPress: () {
            if (widgets.isNotEmpty) {
              showAboutDialog(
                applicationName: "Name",
                context: context,
                children: <Widget>[
                  Text('Title:${widgets[i]["title"]}'),
                  Divider(),
                  Text('Body:${widgets[i]["body"]}'),
                ],
              );
            }
          },
        ),
      ),
    );
  }

  loadData() async {
    String dataURL = "https://jsonplaceholder.typicode.com/posts";
    http.Response response = await http.get(dataURL);
    setState(() {
      widgets = json.decode(response.body);
    });
  }
}


未完待续。。。

相关文章

网友评论

    本文标题:Flutter Http with List

    本文链接:https://www.haomeiwen.com/subject/nouohctx.html