Flutter封装一个简单的网络请求

首先导入第三方网络请求库dio

dio: ^2.1.3

-创建一个dart文件api里面存放项目的api

class HttpApi {
  static final String BASE_URL = "";

  ///登录模块
  static final String LOGIN_URL = BASE_URL + "";

  ///首页模块
  //首页
  static final String HOMEPAGE = BASE_URL + "";
}

-创建一个dart文件error

class ErrorBean {

  final int code;
  final String message;

  ErrorBean(this.code, this.message);
}

主要部分,网络请求

-创建一个dart文件http,创建HttpManage类
1.定义请求方法

  static final String GET = "get";
  static final String POST = "post";

2.定义一个单例,初始化的时候可以设置网络请求的拦截器,请求成功的数据可以封装,因为例子返回data数据的字段不是固定的所以没有进行封装。回调方法用的Function这样可以统一处理特定的错误信息,本来想用接口实现,但是dart的抽象类不可以new,要用的话值能在Widget里面用implements所以放弃了。

static HttpManage _instance;

  static HttpManage getInstance(){
    if(_instance == null){
      _instance = HttpManage();
    }
    return _instance;
  }

  HttpManage(){

    dio = Dio(BaseOptions(
      connectTimeout: 5000,
      receiveTimeout: 100000,
    ));

  }

3.写对应的GET和POST的方法只写了两个常用的网络请求

/**
   * get获取数据
   */
  get(String url, Map<String, dynamic> params, Function success, Function error) async {
    _requestHttp(url, GET, params, success, error);
  }

/**
   * post 获取数据
   */
  post(String url, Map<String, dynamic> params, Function success, Function error) async {
    _requestHttp(url, POST, params, success, error);
  }

/**
   * 网络请求
   */
  _requestHttp(String url, String method, Map<String, dynamic> params, Function success, Function error) async {

    int code;

    Response response;

    if (method == GET) {
      if (params != null && params.isNotEmpty) {
        response = await dio.get(url, queryParameters: params);
      } else {
        response = await dio.get(url);
      }
    } else if (method == POST) {
      if (params != null && params.isNotEmpty) {
        response = await dio.post(url, queryParameters: params);
      } else {
        response = await dio.post(url);
      }
    }

    String dataStr = json.encode(response.data);
    Map<String, dynamic> dataMap = json.decode(dataStr);

    code = dataMap["status"];

    if(code == 200){
      success(dataStr);
    } else {
      ErrorBean errorBean = ErrorBean(code, dataMap["message"]);
      error(errorBean);
    }
  }

4.创建一个dart文件request,创建Request类里面写网络请求

class Request{

  static login(String phone, String psw, Function success, Function error){
    Map<String, dynamic> map = new Map();
    map["mobile"] = phone;
    map["password"] = psw;
    HttpManage.getInstance().post(HttpApi.LOGIN_URL, map, success, error);
  }
}

5.网络请求调用

Request.login(
      mobile,
      psw,
      (String s){

        },
      (ErrorBean e){

      },
    );

6.贴一下页面完整的调用代码

class LoginVC extends StatefulWidget{

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new _LoginState();
  }

}

class _LoginState extends State<LoginVC> {

  FocusNode focusNode = new FocusNode();
  FocusNode focusNode1 = new FocusNode();
  String mobile, psw;
  TextEditingController _unameController = new TextEditingController();
  TextEditingController _pwdController = new TextEditingController();
  GlobalKey _formKey= new GlobalKey<FormState>();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _unameController.addListener((){
      mobile = _unameController.text;
    });
    _pwdController.addListener((){
      psw = _pwdController.text;
    });
  }

  void login(){

    Request.login(
      mobile,
      psw,
      (String s){

        },
      (ErrorBean e){

      },
    );

  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: AppBar(
        title: Text('登录'),
      ),
      body: Padding(
        padding: EdgeInsets.symmetric(vertical: 16, horizontal: 24),
        child: Form(
            key: _formKey,
            autovalidate: true,
            child: Column(
              children: <Widget>[
                TextFormField(
                  autofocus: false,
                  controller: _unameController,
                  decoration: InputDecoration(
                    labelText: "用户名",
                    hintText: "请输入手机号",
                    prefixIcon:Icon(Icons.person),
                  ),
                  focusNode: focusNode,
                  keyboardType: TextInputType.phone,
                  textInputAction: TextInputAction.go,
                  validator: (v){
                    return v.trim()
                        .length > 0 ? null : "手机号码不能为空";
                  },
                ),
                TextFormField(
                  controller: _pwdController,
                  decoration: InputDecoration(
                    labelText: "密码",
                    hintText: "请输入密码",
                    prefixIcon: Icon(Icons.lock),
                  ),
                  obscureText: true,
                  focusNode: focusNode1,
                  validator: (v){
                    return v.trim()
                        .length > 5 ? null : "密码不能少于6位";
                  },
                ),
                Padding(
                  padding: EdgeInsets.only(top: 28.0),
                  child: Row(
                    children: <Widget>[
                      Expanded(
                          child: RaisedButton(
                            child: Text('登录'),
                            padding: EdgeInsets.all(15.0),
                            textColor: Colors.white,
                            color: Colors.blue,
                            onPressed: (){
                              if((_formKey.currentState as FormState).validate()){
                                focusNode.unfocus();
                                focusNode1.unfocus();
                                login();
                              }
                            },

                      ))
                    ],
                  ),
                )

              ],
            ),
        ),
      )
    );
  }
}

不过这个例子的https可以访问成功,http的访问失败,暂时不知道什么原因,用的iOS的模拟器,在iOS项目里面也改了网络请求方式,有没有大神告诉下什么原因,万分感谢!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 4,306评论 0 12
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,067评论 1 32
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,144评论 1 23
  • 亊已至此您是哪一位呢 说也是面目未改那当初 挖一个土坑种一株小树 只有云彩知道那种意义 或许祝愿在彩球上拴着 风筝...
    曹广潼树根草阅读 173评论 0 2
  • 插画:Suki 故事写在两年前 法国南特, 每天清晨醒来,我的第一个习惯动作就是打开手机qq和微信,和深圳那头的搭...
    婳ManjiKids阅读 151评论 0 0