Flutter程式碼規範優化記錄

Nightmare夢魘獸發表於2020-06-02
  • 自從把Flutter SDK中的analysis_options.yaml copy到專案根目錄後就***,當時是700多個error,警告記不清了,提示資訊有7k個,總共花了一天半全部改完。

  • 所以還是得養成良好的程式碼編寫習慣

字串用單引號

除非你的字串中有單引號---> ',不然整個字串用單引號。

泛型規範

只要類的定義中有寫泛型,或者一些方法中用到了泛型,那麼在使用這些類或者呼叫這些方法的時候也一定要加上泛型

最常見的例子

List<String> list=<String>[];
Map<String,String> map=<String,String>{};
Future<void>
複製程式碼

Flutter中:

Navgator.pust<void>
showDialog<void>
Tween<double>
Tween<int>
複製程式碼

根據具體場景新增泛型 在傳遞List或者Map的時候

<T>[]
<T,T>{}
複製程式碼

前面的泛型也務必加上 []也需要在前面加上泛型

省略new關鍵字

有new的都是祖傳程式碼了,沒啥細講的.

不要省略物件的型別

也儘量不要用var與dynamic

final關鍵字

在任何時候使用新的變數,如果它不需要被二次修改,請一定加上final修飾

final String str='Nightmare';
for(final String str in xxx){
    
}
複製程式碼

Map、List的物件都是引用,類似於C語言中的指標,所以在定義後都是不會改變的

final List<int> list= <int>[];
final Map<String,dynamic> map=<String,dynamic>{};
複製程式碼

const修飾

const Duration();
const Text();
const Color(0xffff0000);
const EdgeInsets.only(bottom: 20.0);
複製程式碼

一些巢狀物件的的const

const Center(
    child: SizedBox(
        width: 80,
        height: 80,
        ),
    ),
),
複製程式碼

其中SizedBox的const不用加

if與for語句的花括號

不管if條件後是單語句還是多條語句 都新增大括號{}

if(bool){
    print('');
}
for(***){
  
}
複製程式碼

官方程式碼也有很多單語句不加花括號的...

避免不必要的字串插值

例子:

String number='Nightmare';
Text('$number')
複製程式碼

優化:

String number='Nightmare';
Text(number)
複製程式碼

字串插值避免不必要的的大括號

例子:

int a;
String b='${a}';
複製程式碼

優化:

int a;
String b='$a';
複製程式碼

官方的有些程式碼都有這種情況

字串相加可以省略加號

例子:

'str1'+'str2'
複製程式碼

修改:

'str1' 'str2'
複製程式碼

不要在列表裡面使用相鄰字串

例子:

<String>['str1','str2' 'str3','str4']
複製程式碼

你也許會想幹嘛不寫成 'str2str3' 但有些場景如下

<String>[
    '-c',
    '''export PATH=/data/data/com.nightmare/files/usr/bin:\$PATH
        mkdir /data/data/com.nightmare/files/home/$_index
        busybox unzip -o $_filePath -d /data/data/com.nightmare/files/home/$_index
        cd /data/data/com.nightmare/files/home/$_index
        sh /data/data/com.nightmare/files/home/$_index/install.sh
        rm -rf /data/data/com.nightmare/files/home/$_index
        rm -rf $_filePath'''
    ],
複製程式碼

如果寫成單個字串單行會特別長所以解決方法將整個字串用''',所以有時候可以用三個單引號包起來

回撥函式寫明型別

例子

itemBuilder: (c, i) {}
複製程式碼

優化

itemBuilder: (BuildContext context, int index) {}
複製程式碼

為所有的方法寫上型別

void function()
複製程式碼

或者

Future<void> function() async
複製程式碼

Flutter被遺棄的介面

Theme中

body1=>bodyText2
title=>headline6
subhead=>subtitle1
複製程式碼

這只是我個人專案使用到的,其他的看原始碼就知道了

將條件語句轉換成if-else

bool isExist;
***
isExist?***:***;
複製程式碼

優化

bool isExist;
***
if(isExist){

}else{

}
複製程式碼

類的建構函式在所有子成員前面

先寫構造,再寫成員引數

如果有沒有用到的包,請在程式碼頂部刪除它

無詳細解釋

導包的排序

  • 有些編譯器不能自動給你修復,需要你手動按照字母將導包的順序排序

並遵循一下大前提如下:

  • dart sdk內的庫
  • flutter內的庫
  • 第三方庫
  • 自己的庫
  • 相對路徑引用

先全部import再export,不要交替進行

類的內部訪問成員省略this.

無詳細解釋

有一些不想要更改的規範

dart官網有介紹,在使用以下方法時,非同步比同步要慢得多

Directory.exists
Directory.stat
File.lastModified
File.exists
File.stat
FileSystemEntity.isDirectory
FileSystemEntity.isFile
FileSystemEntity.isLink
FileSystemEntity.type
複製程式碼

但個人遇到的很多場景帶sync的方法會把UI卡住,尤其是在這些方法短時間裡頻繁訪問的情況,所以我註釋掉了analysis_options.yaml的這一行。

最後

  • 有任何錯誤指出
  • 個人專案在Flutter1.0的正式版前就已經使用了,依稀記得是0.7,當時程式設計基礎所有的能力很不紮實(現在也差不多),所以有很多沒能避免的地方,但我在知道怎麼優化的時候,一定及時優化。
  • 可能大家沒有體驗過,一邊學Flutter一邊學C語言的hello world吧,所以說話與評價些許有些輕鬆。
  • 記錄給需要的人,在這些場景程式碼編寫規範。

相關文章