Flutter入门(4)网络请求

 

 准备写了好几天,又墨迹了几天。终于一边百度一边查资料写完了。 

网络请求使用的是玩安卓的api。https://www.wanandroid.com/blog/show/2

写网络请求我用的是第三方库dio,也是Flutter中文网开发的一个开源网络请求库,GitHub地址。需要了网络请求还要json

解析 json_serializable,在 pubspec.yaml 文件中导入依赖,(注意一定要格式对应)。

  dio: ^2.1.0
  json_annotation: ^1.2.0

  build_runner: ^0.10.2
  json_serializable: ^1.5.1

  Flutter入门(4)网络请求_第1张图片

如果格式没有问题的话,然后点击右上角packages get 就可以了。

在android中使用retrofit中又一个ApiService 用来具体请求的,还有构建一个网络请求的工具类。

我们先写好网络请求的工具类 HttpUtil。

import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';

class HttpUtil {
  static const BASE_URL = 'https://www.wanandroid.com/';

  factory HttpUtil() => instance;
  static final HttpUtil instance = HttpUtil._internal();
  Dio dio;

  HttpUtil._internal() {
    if (dio == null) {
      BaseOptions options = BaseOptions();
      options.baseUrl = BASE_URL; //baseurl
      options.receiveTimeout = 1000 * 8; // 8 秒
      options.connectTimeout = 1000 * 6; // 6 秒  连接超时时间
      dio = Dio(options);
    }
  }

  ///-GET请求 parms为可选请求参数
  Future get(String path, [Map parms]) async {
    if (parms != null) {
      var response = await dio.get(path, queryParameters: parms);
      return response;
    } else {
      var response = await dio.get(path);
      return response;
    }
  }

  ///-POST请求,parms为可选请求参数
  Future post(String path, [Map parms]) async {
    if (parms != null) {
      var response = await dio.post(path, queryParameters: parms);
      return response;
    } else {
      var response = await dio.post(path);
      return response;
    }
  }
}

网络请求工具类里面简单封装了get 与 post请求。下面我们在生成json,在android 中又jsonFomat,flutter中也有对应的插件,一键生成bean类。安装插件,我已经安装过了,你只要点红色箭头的地方搜索这个,然后安装完毕重启就可以了。

Flutter入门(4)网络请求_第2张图片

右键生成json。wananroid api:https://www.wanandroid.com/article/list/0/json 

 Flutter入门(4)网络请求_第3张图片

Flutter入门(4)网络请求_第4张图片

然后写ApiService 具体的网络请求。

import 'package:flutter_app/bean/project_content_entity.dart';
import 'package:flutter_app/http/HttpUtils.dart';
class ApiService {

  /// 首页文章列表 https://www.wanandroid.com/article/list/0/json
  static const PROJECT_CONTENT_LIST = 'article/list/';

  ///获取首页文章列表 [page]页数
  static Future getProjectContentData(int page) async {
    try {
      var response = await HttpUtil().get('$PROJECT_CONTENT_LIST$page/json');
      return ProjectContentEntity.fromJson(response.data);
    } catch (e, s) {
      print('TAG$s');
      return null;
    }
  }
}
import 'package:flutter/material.dart';
import 'package:flutter_app/http/ApiService.dart';
import 'package:flutter_app/bean/project_content_entity.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State createState() {
    return new MyAppState();
  }
}

class MyAppState extends State {
  List _chapterList = [];
  int page = 0;

  @override
  void initState() {
    super.initState();
    _loadChapterData(); //初始化数据
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: AppBar(
          title: Text("flutter网络请求"),
          centerTitle: true,
        ),
        body: new ListView.builder( //返回一个listView列表
            itemCount: _chapterList.length, //item长度
            itemBuilder: (context, index) {
              return _itemChapter(index);
            }),
      ),
    );
  }

  _loadChapterData() {
    //网络请求更新数据
    ApiService.getProjectContentData(page).then((list) {
      setState(() {
        _chapterList.addAll(list.data.datas);
      });
    });
  }

  Widget _itemChapter(int index) {
    var projectData = _chapterList[index];
    return InkWell( //InkWell 是个点击效果
      child: Card( // 卡片布局
          margin: EdgeInsets.all(6.0), //偏移
          child: Column( //相当于垂直布局
            crossAxisAlignment: CrossAxisAlignment.start,// 开始位置
            children: [
              Padding(
                padding: EdgeInsets.all(8.0), //所有的偏移8
                child: Text(projectData.title,
                    style: TextStyle(fontSize: 16.0, color: Colors.black)),
              ),
              Padding(
                  padding: EdgeInsets.fromLTRB(8.0, 1.0, 8.0, 1.0), //
                  child: Text(
                    '${(projectData.superChapterName)}/${(projectData.chapterName)}',
                    style: TextStyle(fontSize: 13.0, color: Colors.blue[300]),
                  )),
              Padding(
                padding: EdgeInsets.all(8),
                child: Row( //水平布局
                  children: [
                    Icon(
                      Icons.person,
                      color: Colors.grey,
                    ),
                    Padding(
                      padding: EdgeInsets.fromLTRB(5, 0, 0, 0),
                      child: Text(
                        projectData.author,
                        style: TextStyle(fontSize: 12, color: Colors.grey),
                      ),
                    ),
                    Expanded( //填充 Row、Column、Flex会被Expanded撑开,充满主轴可用空间
                      flex: 1,
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.end, //相当于的grivate.end
                        children: [
                          Icon(
                            Icons.timer,
                            color: Colors.grey,
                          ),
                          Text(projectData.niceDate,
                              style:
                                  TextStyle(fontSize: 12, color: Colors.grey))
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ],
          )),
    );
  }
}

 下一篇是这个item解析的,他的布局是怎么样的。

  Flutter入门(5)Item布局解析

Flutter入门(4)网络请求_第5张图片

你可能感兴趣的:(Flutter)