Flutter實際開發bug總結

rhyme_lph發表於2019-08-27

目錄

1.1 安卓release包缺少libflutter.so

1.2 AndroidStudio匯入專案後自動變為model,沒有Flutter目錄

1.3 輸入框內容為空時,長按不顯示貼上工具欄

1.4 SWIFT_VERSION '5.0' is unsupported, supported versions are: 3.0, 4.0, 4.2

1.5 複製貼上皮膚英文的問題

1.6 呼叫庫的時候報Methods marked with @UiThread must be executed on the main thread.Current thread: XXXX

1.7 用Navigator.of(context).pushNamed(routeName)如何傳遞引數

1.8 監聽NestedScrollViewbody屬性裡的widget滾動事件

1.1 安卓release包缺少libflutter.so

修改/android/app/build.gradle檔案如下

android{
    defaultConfig{
        ndk {
            abiFilters "armeabi-v7a", "x86"
       }
    }
    buildTypes {
          debug {
              ndk {
                abiFilters "armeabi-v7a", "x86"
              }
          }
          release {
              ndk {
                 abiFilters "armeabi-v7a"
              }   
         }
    }
}
複製程式碼

1.2 AndroidStudio匯入專案後自動變為model,沒有Flutter目錄

image.png
解決方法: 在匯入專案時選擇下面選項 File-Open-選中你的專案

1.3 輸入框內容為空時,長按不顯示貼上工具欄

將輸入框中的autoFocus屬性為ture去掉

1.4 SWIFT_VERSION '5.0' is unsupported, supported versions are: 3.0, 4.0, 4.2

將專案開啟為ios專案,然後在檔案列面中找到Pods(建議升級xcode即可解決)

image.png

1.5 複製貼上皮膚英文的問題

pubspec.yaml新增國際化支援,然後執行flutter packages get

dependencies:
  ...
  flutter_localizations:
    sdk: flutter
複製程式碼

找到程式碼MaterialApp或者CupertinoApp或者WidgetsApp的檔案,新增下面程式碼即可

        MaterialApp(
//...
//new
                localizationsDelegates: const [
                  GlobalMaterialLocalizations.delegate,
                  GlobalWidgetsLocalizations.delegate
                ],
                supportedLocales:[
                  Locale('zh',''),
                  Locale('en','')
                ],
//new
              )
複製程式碼

1.6 呼叫庫的時候報Methods marked with @UiThread must be executed on the main thread.Current thread: XXXX

出現該異常的主要原因是Flutter1.7.8版本新增了執行緒安全,需要原生在主執行緒中返回給Flutter 解決方法:

  • 庫的問題? 到pub庫中找到最新的版本,更改最新的版本,然後執行flutter packages get
  • 自己寫的庫問題? 假如:
//Result result  flutter的result
new Thread(new Runnable() {
      public void run() {
//.....
result.success(null);//這裡就會導致異常
     }).start();
複製程式碼

改為

//Result result  flutter的result
new Thread(new Runnable() {
      public void run() {
//.....
    new Handler().post(new Runnable() {
                @Override
                public void run() {
                    result.success(file.getAbsolutePath());
                }
            });
     }).start();
複製程式碼

上面是虛擬碼,不建議這樣做,可能會導致記憶體溢位

1.7 用Navigator.of(context).pushNamed(routeName)如何傳遞引數

傳遞引數

Navigator.of(context).pushNamed(routeName,arguments:{
  “name":"我是引數"
})
複製程式碼

獲取引數

final arguments=ModalRoute.of(context).settings.arguments;
複製程式碼

1.8 監聽NestedScrollViewbody屬性裡的widget滾動事件

這個只要在對應的body裡巢狀NotificationListener即可

        NestedScrollView(
//          controller: scrollController,
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return [
              //....
            ];
          },
          body: Builder(
              builder: (BuildContext context) => NotificationListener<ScrollNotification>(
                   onNotification: onNotification,//你要的監聽
                   child: CustomScrollView(
                         slivers: <Widget>[
                           //....
                         ],
                  ),
            ),
        )
複製程式碼

歡迎在評論區留下你的bug問題,線上~~~~修bug

相關文章