Flutter代碼規範優化記錄

  • 自從把Flutter SDK中的analysis_options.yaml copy到項目根目錄後就***,當時是700多個error,警告記不清了,提示信息有7k個,總共花了一天半所有改完。編程

  • 因此仍是得養成良好的代碼編寫習慣bash

字符串用單引號

除非你的字符串中有單引號---> ',否則整個字符串用單引號。異步

泛型規範

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

最多見的例子函數

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

Flutter中:優化

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

根據具體場景添加泛型 在傳遞List或者Map的時候ui

<T>[]
<T,T>{}
複製代碼

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

省略new關鍵字

有new的都是祖傳代碼了,沒啥細講的.spa

不要省略對象的類型

也儘可能不要用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吧,因此說話與評價些許有些輕鬆。
  • 記錄給須要的人,在這些場景代碼編寫規範。
相關文章
相關標籤/搜索