项目搭建(上)
一起从0开始Flutter实战!
作为Flutter实战的开篇,我们需要介绍下我们要做的内容以及我们的准备工作,为了能让我们的实战顺利进行需要一个开放的API接口服务平台,选择了半天最终选择了一个开发者平台,感谢玩安卓的开发者提供的开放API,可以让我们在练习一些项目的时候使用。玩安卓的开放API提供了很多的功能,具体的功能可以参照玩安卓API。
确定了我们要做什么我们就可以着手准备了,我们先把项目的结构分为哪些模块进行设计。
lib
-constants //存放一些常量
-events //跨界面的事件传递
-model //解析的数据和数据库数据
-network //网络请求以及网络配置
-pages //单独页面的集合
-route //页面的路由配置,避免多出配置导致的混乱
-utils //一些工具类
-widgets //小的工具组件,单独的widget
整体的一个结构就出来了,根据习惯我们还是先准备一些工具类,和网络的请求,先把与业务无关的工具准备好,这样让我们以后开始的时候更加的顺畅。网络的三方库配置在以前已经有介绍,不再多说了,我们当时也说在以后的实践中是需要进行一个封装的,我们一起来研究下如何能做一个合理的封装:
我选择的是创建一个单例的Http配置类,这样我们可以对Dio进行一次配置通用的效果:
class HttpConfig {
static String BASE_URL = "";
static HttpConfig _config;
static HttpConfig get instance => _getInstance();
Dio dio;
HttpConfig._internal() {
var baseOption = BaseOptions(
connectTimeout: 6000,
sendTimeout: 3000,
baseUrl: BASE_URL,
headers: HttpHeaderConfig.getHeaderConfig(),//这里使用的一个方法而不是一个变量来配置的header,因为有些header我们会放到sharePerence里,所以我们使用一个方法来可以随时进行读取
);
dio = Dio(baseOption);
dio.interceptors.add(InterceptorsWrapper(//这里创建一个拦截器,拦截器在我们根据需要进行消息的拦截
onRequest: (option) {
},
onResponse: (response) {
if (response.statusCode == 400 || response.statusCode == 404) {
}//这里拦截了错误的状态的返回
},
onError: (error) {
}));
}
static HttpConfig _getInstance() {
if (_config == null) {
_config = HttpConfig._internal();
}
return _config;
}
//这里创建一个get请求的方法,不是直接把dio做成公用而是提供get方法是为了以后如果我们替换整个网络请求库的时候方便更换,还有一个原因,是我们在一般请求的时候需要对参数进行签名,这里可以帮助我们做统一的处理。
void get<T>(String path,
{
Map<String, dynamic> params,
Function(T t) onSuccess, //这里对返回结果已经做了处理也是为了以后如果网络框架修改后能低成本迁移
Function(int error) onError}) async {
Response response;
try {
response = await dio.get(path, queryParameters: params);
if (response.statusCode == 200 && onSuccess != null) {
//先做过滤,这样我们在处理的时候就省去了很多重复代码
onSuccess(response.data);
} else if (onError != null) {
onError(response.statusCode); //如果状态码不对,则返回错误数据
}
}