Github
安卓請掃碼下載體驗(yàn),ios沒有證書,無法下載。
QRCode_258.png
項(xiàng)目結(jié)構(gòu)
(logo)
2019年谷歌推出Provider,代替 Provide 成為官方推薦的狀態(tài)管理方式,Provide已經(jīng)不再維護(hù),項(xiàng)目已經(jīng)逐漸替換成了Provider,項(xiàng)目默認(rèn)分支是provider,可下載該分支查看。
我的主頁 老鐵們幫忙點(diǎn)個(gè)廣告: https://www.darrenblog.cn/#/detail/5dbf9a8a7bb725236692b6d4
該項(xiàng)目的特點(diǎn)
1、使用mvvm架構(gòu)編寫。 MVVM架構(gòu)在Flutter中的簡單實(shí)踐
2、Provider和RxDart 的使用
部分封裝介紹
1、refresh組件:刷新組件是在pull_to_refresh的基礎(chǔ)上進(jìn)行的再次封裝,該庫本身是存在一些問題的,所以就自己改了一下使用。希望該庫持續(xù)更新,還有其他的刷新庫,這里就不詳細(xì)說了。主要是我們在使用時(shí)最好能夠讀懂別人的組件庫的代碼,這樣才能更好的解決問題。也是一種學(xué)習(xí)方式。pull__to__refresh
2、OpacityTapWidget組件:OpacityTapWidget組件解決了2個(gè)問題:
1)點(diǎn)擊效果:點(diǎn)擊時(shí)child有一個(gè)透明度的變化
2)點(diǎn)擊的熱區(qū)問題: OpacityTapWidget內(nèi)部設(shè)置padding增加了點(diǎn)擊的熱區(qū)。
new OpacityTapWidget(
onTap: () {
Navigator.of(context).pop();
},
child: new Icon(Icons.close, color: Colors.white,size: 27,),
)
3、TapWidget組件:和OpacityTapWidget不一樣的是TapWidget點(diǎn)擊的效果是背景顏色的變化。
部分第三方庫的封裝與介紹
1.dio 網(wǎng)絡(luò)請求封裝: Dio
- Dio初始化
dio = new Dio()
..options = BaseOptions(
baseUrl: AppConfig.baseUrl,
connectTimeout: 30000,
receiveTimeout: 30000)
..interceptors.add(HeaderInterceptor());
..interceptors.add(LogInterceptor(responseBody: true, requestBody: true));
- 攔截器
class HeaderInterceptor extends Interceptor {
@override
onRequest(RequestOptions options) {
final token = AppConfig.userTools.getUserToken();
if (token != null && token.length > 0) {
options.headers.putIfAbsent('Authorization', () => 'Bearer' + ' ' + token);
}
// if (options.uri.path.indexOf('api/user/advice/Imgs') > 0 || options.uri.path.indexOf('api/user/uploadUserHeader') > 0) { // 上傳圖片
// options.headers.putIfAbsent('Content-Type', () => 'multipart/form-data');
// print('上傳圖片');
// } else {
// }
// options.headers.putIfAbsent('Content-Type', () => 'application/json;charset=UTF-8');
return super.onRequest(options);
}
}
2. rxdart
- 屬性監(jiān)聽
方式1:
final subjectMore = new BehaviorSubject<bool>.seeded(false);
方式2:
final subjectMore = new BehaviorSubject<bool>();
subjectMore.value = false
_provide.subjectMore.listen((hasMore) {
});
方式1與方式2的不同是,方式1再初始化時(shí)就會觸發(fā),監(jiān)聽者會在初始化時(shí)監(jiān)聽到false參數(shù)。
3.flutter_svg 初始化svg格式的圖片
new SvgPicture.asset("images/is_single.svg", width: 28, height: 28);
4.shared_preferences 數(shù)據(jù)存儲
由于數(shù)據(jù)的存儲和獲取是異步的,但是在項(xiàng)目中使用同步的方法獲取用戶信息就很是有必要,所以該項(xiàng)目再初始化之前就初始化了shared_preferences,解決了在項(xiàng)目中使用同步的方法獲取用戶信息這個(gè)問題。
void main() async {
/// 先初始化shared_preferences
await AppConfig.init();
runApp(MyApp());
}
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.53.png
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.18.png
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.21.png
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.25.png
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.28.png
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.35.png
Simulator Screen Shot - iPhone X? - 2019-05-06 at 18.23.38.png