flutter网络编程之dio封装
2020-07-01
Flutter
1119
0
一、添加依赖pubspec.yamldependencies:
dio:^3.0.9二、dio封装2.1、创建http_service.dart文件(/lib/service/http_conf.dart),用于dio请求封装import'package:dio/dio.dart';
import'dart:async';
import'dart:io';
import'../config/index.dart';
import'../config/http_conf.dart';
Futurerequest(url,{formData})async{
try{
Responseresponse;
Diodio=newDio();
//dio.options.contentType=ContentType.parse('application/x-www-form-urlencoded');
if(formData==null){
response=awaitdio.post(servicePath[url]);
}else{
response=awaitdio.post(servicePath[url],data:formData);
}
if(response.statusCode==200){
returnresponse;
}else{
throwException('后端接口异常..');
}
}catch(e){
returnprint('error:::${e}');
}
}2.2、创建index.dart文件(/lib/service/ index.dart)用于引入http_conf.dart配置export'http_conf.dart';2.3、创建http_conf.dart文件(lib/config/ http_conf.dart)constbase_url="http://new.163.top/api/Index/";//公共域名
constservicePath={
'gmovie':base_url+'gmovie',//获取电影
};三、使用方法: 定义一个方法请求数据request(请求方法,请求参数’)voidinitState(){
super.initState();
_getvod();
}
void_getvod(){
request('gmovie',formData:page).then((val){
vardata=json.decode(val.toString());
ListnewvodList=(data['data']asList).cast();
setState((){
vodList.addAll(newvodList);
page++;
});
});
}四、demo以下以获取列表数据为例:import'package:flutter/material.dart';
import'package:flutter/rendering.dart';
import'package:flutter_screenutil/flutter_screenutil.dart';
import'../config/index.dart';
import'../service/http_service.dart';
import'dart:convert';
import'package:flutter_easyrefresh/easy_refresh.dart';
import'detail_page.dart';
import'package:date_format/date_format.dart';
classMoviePageextendsStatefulWidget{
_MoviePageStatecreateState()=>_MoviePageState();
}
class_MoviePageStateextendsState{
//电影
intpage=1;
ListvodList=[];
//防止刷新处理保持当前状态
@override
boolgetwantKeepAlive=>true;
GlobalKey_headerKey=newGlobalKey();
GlobalKey_footerKey=newGlobalKey();
@override
voidinitState(){
super.initState();
_getvod();
}
@override
Widgetbuild(BuildContextcontext){
//super.build(context);
returnScaffold(
backgroundColor:Color.fromRGBO(244,245,245,1),
appBar:AppBar(
title:Text(KSting.movieTitle),),
body:FutureBuilder(
future:request('gmovie',formData:null),
builder:(context,snapshot){
if(snapshot.hasData){
returnEasyRefresh(
refreshFooter:ClassicsFooter(
key:_footerKey,
bgColor:Colors.white,
textColor:KColor.refreshTextColor,
moreInfoColor:KColor.refreshTextColor,
showMore:true,
moreInfo:"${formatDate(DateTime.now(),[yyyy,'-',mm,'-',dd,'',HH,':',nn,':',ss])}",//加载中
loadText:KSting.loadText,
loadReadyText:KSting.loadReadyText,
loadingText:KSting.loadingText,
loadedText:KSting.loadedText,
noMoreText:KSting.noMoreText,
),
refreshHeader:ClassicsHeader(
key:_headerKey,
refreshText:KSting.loadText,
refreshReadyText:KSting.refreshReadyText,
refreshingText:KSting.refreshingText,
refreshedText:KSting.refreshedText,
moreInfo:"${formatDate(DateTime.now(),[yyyy,'-',mm,'-',dd,'',HH,':',nn,':',ss])}",
bgColor:Colors.white,
textColor:KColor.refreshTextColor,
moreInfoColor:KColor.refreshTextColor,
showMore:true,
),
child:ListView(
children:[
_vodBox(),//电影
],
),
loadMore:()async{
_getvod();
},
onRefresh:_pullToRefresh,
);
}else{
returnCenter(
child:CircularProgressIndicator()
);
//returnCenter(
//child:Text('加载中'),
//);
}
},
),
);
}
//获取电影数据
void_getvod(){
request('gmovie',formData:page).then((val){
vardata=json.decode(val.toString());
ListnewvodList=(data['data']asList).cast();
setState((){
vodList.addAll(newvodList);
page++;
});
});
}
//下拉刷新,必须异步async不然会报错
Future_pullToRefresh()async{
print('正在刷新');
page=1;
vodList.clear();
_getvod();
returnnull;
}
//电影
Widget_warpvodList(){
ListlistWiget=vodList.map((val){
returnInkWell(
onTap:(){
Navigator.of(context).push(
MaterialPageRoute(builder:(context)=>DetailPage(
eachVodId:val['id'],
eachVodName:val['vod_name'],
p:1
))
);
},
child:Container(
width:ScreenUtil().setWidth(235),
color:Colors.white,
padding:EdgeInsets.only(bottom:20.0,top:15.0),
child:Column(
children:[
Image.network(
val['vod_pic'],
width:ScreenUtil().setWidth(235),
height:150,
fit:BoxFit.cover,
),
Text(
val['vod_name'],
maxLines:1,
overflow:TextOverflow.ellipsis,
style:Kfont.tvStyle,
),
Text(
val['vod_content'],
maxLines:1,
overflow:TextOverflow.ellipsis,
style:Kfont.mintvStyle
),
],
),
),
);
}).toList();
returnWrap(
spacing:2,
children:listWiget,
);
}
//电影组合
Widget_vodBox(){
returnContainer(
child:Column(
children:[
_warpvodList()
],
),
);
}
}