技術背景: 做了幾年前端,會用node 寫這篇文章是自己對這段時間做個技術總結,記錄一些開發過程中比較難以解決的問題和經驗,同時希望對Flutter感興趣但還在觀望的同學加入Flutter開發,簡單易上手
學習資料
Flutter 實戰, 入門可以看這本電子書,很多flutter知識都是從這裡學習到的,在此感謝下作者
一些小結
1. 路由跳轉
- 註冊路由 main.dart
MaterialApp(
routes:{
'my_page': (context) => MyPage(),
...
}
)
複製程式碼
- 點選跳轉 xxx.dart
FlatButton(
onPressed: () {
// 可通過arguments傳遞引數
Navigator.pushNamed(context, 'my_page', arguments: {'data': data});
}
)
複製程式碼
2. 迴圈widget
Row(children: strings.map((item) => Text(item)).toList());
3. 寬高設定
前端開發中html標籤是可以自行設定寬高,顏色,但在flutter中只有幾個widget可以(剛開始接觸有點不習慣)
// 可設定寬高及顏色
Container(
// 滿屏
width: MediaQuery.of(context).size.width,
height: 200,
color: Colors.blue
)
// 可設定寬高
SizedBox(
width: 200,
height: 200
)
複製程式碼
- 如果要給按鈕設定大小,便可通過在外包裹個Container來控制大小:
Container(
width: 80,
height: 30,
child: FlatButton()
)
複製程式碼
- 也可以使用
ButtonTheme
來修改按鈕大小:
ButtonTheme(
minWidth: 65.0,
height: 24.0,
child: OutlineButton()
)
複製程式碼
- 圖片可自行設定寬高
4. 區分環境
把啟動檔案按環境分為main_local,main_dev.dart,main.dart,根據需要啟動不同檔案,詳見 Flutter 實現根據環境載入不同配置
- android studio設定執行環境, 設定後可以很快切換環境
- vscode 設定
launch.json
檔案的"program": "lib/main.dart"
為不同的啟動檔案即可
不過帶來的問題是涉及
main.dart
的修改都需要改三份檔案
5. flutter封裝的元件
flutter封裝了一些元件,可以讓開發者專注於業務,如TabBar, DatePicker等
6. dio增加配置資訊
token,版本號,ip等資訊需要由app傳到服務端,不能每次請求都獲取一遍這些資訊,可以統一設定一次 dao_basis.dart
Dio dio = Dio()..interceptors.add(InterceptorsWrapper(
// 請求時的處理
onRequest: (RequestOptions options) async {
String _platform = 'android';
String _version = packageInfo.version;
options.headers..addAll({
'platform': _platform,
'version': _version,
})
}
// 相應時的處理
onResponse: (Response options) async {
// 對響應狀態碼如401的處理
if (options.data['code'] == 401) {
...
}
}
// 發生錯誤時的處理
onError: (DioError err) {
...
}
))
複製程式碼
user_dao.dart
// 其他請求引用上個檔案即可
import 'dao_basis.dart';
Response res = await dio.get('xxx);
複製程式碼
7. ios證書設定指南
極光推送文件, 比騰訊信鴿的詳細且新
奇怪的問題
-
連線真機失敗 Error connecting to the service protocol: HttpException 剛開始切換wifi還好使,後來漸漸這招失敗次數也多了;意外發現重新連線下手機就可以了,不過最近發現這招也有不行的時候了,雖然失敗次數少。
-
Check failed: vm. Must be able to initialize the VM
忘了改了什麼,用vscode執行和xcode執行都不行,用android studio試了下居然可以了,也是很奇怪 -
安卓真機執行不了 先執行安卓模擬器,再執行真機
-
MissingPluginException(No implementation found for method startWork on channel xxx)
新安裝的包,有時需要到ios目錄pod install
使用的第三方包
羅列下用到的第三方包(常用的如dio,flutter_swiper等就不列了),省的大家再去尋找啦
彈窗
fluttertoast
使用很方便,不需要傳context
,引入後隨意呼叫;
不過貌似取消不了,詳見issue Fluttertoast.cancel() not work
loading
進行網路請求等操作時的loading狀態 modal_progress_hud
網路圖片處理
快取網路圖片,且帶有loading的placeholder cached_network_image
下拉重新整理
下拉重新整理及上拉載入 flutter_easyrefresh
app名為小魚乾,主要功能是提供上門喂貓服務,歡迎下載使用