一、常用組件
1.基礎組件
組件 說明 示例 Text 顯示文本 Text(‘Hello Flutter’, style: TextStyle(fontSize: 20)) Image 顯示圖片 Image.network(‘https://example.com/image.jpg’) Icon 顯示圖標 Icon(Icons.home, size: 30, color: Colors.blue) RaisedButton / ElevatedButton 按鈕 ElevatedButton(onPressed: () {}, child: Text(‘Click’)) TextField 輸入框 TextField(decoration: InputDecoration(labelText: ‘Name’))
1. Text:文本顯示組件
功能:用于顯示一段文本。 常用屬性: style:設置文本樣式,如字體大小、顏色等。 textAlign:設置文本對齊方式。 maxLines:設置最大顯示行數。 overflow:設置文本溢出處理方式,如省略號。
Text('Flutter 組件配置詳解',style: TextStyle(fontSize: 20, color: Colors.black, fontWeight: FontWeight.bold),textAlign: TextAlign.center,maxLines: 1,overflow: TextOverflow.ellipsis,
)
屬性 類型 說明 data
String
顯示的文本內容 style
TextStyle
字體大小、顏色、行高等 textAlign
TextAlign
文本對齊(left、right、center、justify) maxLines
int
最大顯示行數 overflow
TextOverflow
溢出處理:ellipsis(省略號)等
2. Image:圖片顯示組件
功能:用于顯示圖片,支持網絡圖片、本地圖片等。 常用屬性: image:圖片資源,如 AssetImage、NetworkImage。 width、height:設置圖片寬高。 fit:設置圖片的適應方式,如填充、覆蓋等。
Image.network('https://example.com/image.jpg',width: 200,height: 100,fit: BoxFit.cover,alignment: Alignment.center,
)
屬性 類型 說明 image
ImageProvider
圖片數據,如 AssetImage
, NetworkImage
width
/ height
double
寬/高 fit
BoxFit
縮放方式:fill、cover、contain、fitWidth、fitHeight repeat
ImageRepeat
是否重復顯示圖片 alignment
Alignment
對齊方式
3. Icon:圖標組件
功能:用于顯示圖標。 常用屬性: icon:圖標數據,如 Icons.home。 size:圖標大小。 color:圖標顏色。
4. ElevatedButton:按鈕組件
功能:用于創建一個凸起的按鈕。 常用屬性: onPressed:按鈕點擊事件處理 child:按鈕的子組件,通常是文本。 style:按鈕樣式,如背景色、形狀等。
ElevatedButton(onPressed: () => print('Clicked'),child: Text('提交'),style: ElevatedButton.styleFrom(primary: Colors.blue,onPrimary: Colors.white,padding: EdgeInsets.symmetric(horizontal: 20, vertical: 12),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),),)
屬性 類型 說明 onPressed
Function()
按鈕點擊事件 child
Widget
按鈕內容 style
ButtonStyle
自定義樣式:背景色、形狀、邊距
5.TextField:文本輸入框組件
功能:用于接收用戶輸入的文本。 常用屬性: controller:控制器,用于獲取輸入內容。 decoration:輸入框的裝飾,如提示文本、邊框等。 obscureText:是否隱藏輸入內容,常用于密碼輸入。
TextField(controller: _usernameController,obscureText: false,keyboardType: TextInputType.text,maxLength: 20,decoration: InputDecoration(labelText: '用戶名',hintText: '請輸入用戶名',prefixIcon: Icon(Icons.person),border: OutlineInputBorder(),),onChanged: (value) {print('輸入內容:$value');},
)
屬性 類型 說明 controller
TextEditingController
控制器(獲取/設置輸入值) decoration
InputDecoration
輸入框裝飾 obscureText
bool
是否隱藏內容(密碼輸入) keyboardType
TextInputType
鍵盤類型:text、number、email 等 maxLength
int
最大輸入長度 onChanged
(value) => void
內容改變時的回調
2.布局組件
組件 說明 示例 Row / Column 橫/縱向布局 Row(children: [Text(‘A’), Text(‘B’)]) Container 容器,可設大小、顏色、邊距等 Container(width: 100, height: 100, color: Colors.red) Padding 添加內邊距 Padding(padding: EdgeInsets.all(8), child: Text(‘Padded’)) Expanded 撐滿剩余空間 Expanded(child: Container(color: Colors.green)) Stack 疊層布局 Stack(children: […])
組件 說明 示例代碼 Container
常用容器組件,支持 padding、margin、decoration Container(width: 100, margin: EdgeInsets.all(10))
Padding
僅設置內邊距 Padding(padding: EdgeInsets.all(10), child: ...)
Align
/ Center
對齊子組件 Center(child: Text("中間"))
Row
/ Column
橫向或縱向排列子組件 Row(children: [Text("A"), Text("B")])
Expanded
填滿剩余空間 Expanded(child: Container(color: Colors.red))
SizedBox
固定寬高或空隙 SizedBox(height: 20)
Stack
組件層疊 Stack(children: [Container(), Positioned(...)])
Wrap
自動換行布局 Wrap(children: [...])
Spacer
占位間隔 Spacer(flex: 1)
1. Row 和 Column:線性布局組件
功能:分別用于水平和垂直排列子組件。 常用屬性: mainAxisAlignment:主軸對齊方式。 crossAxisAlignment:交叉軸對齊方式。 children:子組件列表。
Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,crossAxisAlignment: CrossAxisAlignment.center,children: [Icon(Icons.star),Icon(Icons.star),Icon(Icons.star),],
)
屬性 類型 說明 children
List<Widget>
子組件列表 mainAxisAlignment
MainAxisAlignment
主軸對齊 crossAxisAlignment
CrossAxisAlignment
交叉軸對齊 mainAxisSize
MainAxisSize
主軸占用空間(max/min)
2. Container:容器組件
功能:用于創建一個矩形可視區域,可設置大小、邊距、邊框、背景色等 常用屬性: width、height:設置寬高。 padding、margin:內邊距和外邊距。 decoration:裝飾,如背景色、邊框等
Container(width: 200,height: 100,padding: EdgeInsets.all(10),margin: EdgeInsets.only(top: 20),alignment: Alignment.center,decoration: BoxDecoration(color: Colors.amber,borderRadius: BorderRadius.circular(10),boxShadow: [BoxShadow(color: Colors.grey, blurRadius: 4)],),child: Text('我是容器'),
)
屬性 類型 說明 width
/ height
double
寬高 padding
/ margin
EdgeInsets
內/外邊距 decoration
BoxDecoration
背景、邊框、陰影、圓角等 alignment
Alignment
子組件對齊方式 child
Widget
子組件
3. Stack 和 Positioned:堆疊布局組件
功能:用于堆疊多個子組件,可以通過 Positioned 精確定位。 常用屬性: alignment:設置子組件的對齊方式。 children:子組件列表
Stack(children: [Container(width: 200, height: 200, color: Colors.green),Positioned(top: 20,left: 20,child: Container(width: 100, height: 100, color: Colors.red),),],
)
屬性 類型 說明 alignment
Alignment
默認子組件對齊方式 children
List<Widget>
子組件列表 fit
StackFit
子組件如何填充 Stack
3.功能類組件
組件 說明 示例代碼 AppBar
頁面頂部導航欄 AppBar(title: Text("標題"))
BottomNavigationBar
底部導航欄 BottomNavigationBar(items: [...])
Drawer
抽屜菜單 Drawer(child: ListView(...))
TabBar
/ TabBarView
頂部選項卡 配合 TabController
使用 Navigator
頁面跳轉 Navigator.push(context, MaterialPageRoute(builder: (_) => Page()))
AlertDialog
彈窗對話框 showDialog(context: ..., builder: (_) => AlertDialog(...))
GestureDetector
手勢識別 GestureDetector(onTap: () { ... })
1. ListView:可滾動的列表組件
功能:用于顯示一個可滾動的列 常用屬性: children:子組件列表。 itemBuilder:用于懶加載子組件。 separatorBuilder:用于添加分隔線。
ListView.builder(itemCount: 10,itemBuilder: (context, index) {return ListTile(leading: Icon(Icons.person),title: Text('Person $index'),subtitle: Text('Subtitle $index'),);},
)
屬性 類型 說明 children
List<Widget>
靜態子組件列表 itemBuilder
IndexedWidgetBuilder
構建子項 itemCount
int
子項數量 scrollDirection
Axis
滾動方向(horizontal, vertical)
2. GridView:網格布局組件
功能:用于創建一個網格布局的可滾動列表 常用屬性: gridDelegate:控制網格的布局方式。 children:子組件列表。
GridView.count(crossAxisCount: 2,children: List.generate(4, (index) {return Center(child: Text('Item $index',style: Theme.of(context).textTheme.headline5,),);}),
)
屬性 類型 說明 crossAxisCount
int
橫軸顯示個數 mainAxisSpacing
double
主軸間距 crossAxisSpacing
double
橫軸間距 childAspectRatio
double
寬高比
3. Card:卡片組件
功能:用于創建具有圓角和陰影的卡片效果。 常用屬性: elevation:設置陰影的大小。 shape:設置卡片的形狀。 child:卡片的子組件。
Card(elevation: 5,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10),),child: Padding(padding: EdgeInsets.all(16),child: Text('This is a card'),),
)
4. 狀態管理類
setState():最簡單的本地狀態更新方式 插件方式:Provider、Riverpod、GetX、Bloc。
表單組件
組件 說明 示例代碼 TextField
輸入框 TextField(decoration: InputDecoration(labelText: '姓名'))
TextFormField
帶驗證的輸入框 TextFormField(validator: (val) => val!.isEmpty ? '必填' : null)
Form
表單容器 Form(key: _formKey, child: Column(...))
Checkbox
/ CheckboxListTile
復選框 Checkbox(value: true, onChanged: ...)
Radio
/ RadioListTile
單選框 Radio(value: 1, groupValue: _val, onChanged: ...)
Switch
開關 Switch(value: true, onChanged: ...)
DropdownButton
下拉菜單 DropdownButton(items: [...], onChanged: ...)
Slider
滑塊 Slider(value: 50, min: 0, max: 100, onChanged: ...)
5 屏幕適配方案
方案 描述 插件推薦 基于設計稿等比縮放 將 UI 尺寸按比例縮放適配 flutter_screenutil
MediaQuery 自適應 讀取設備尺寸并調整布局 內置 MediaQuery.of(context)
LayoutBuilder 自適應 按父容器的尺寸動態布局 內置 LayoutBuilder(...)
響應式組件封裝 根據屏幕寬度切換 UI responsive_framework
、flutter_responsive
插件推薦:flutter_screenutil
dependencies:flutter_screenutil: ^5.5.3+2
使用實例
import 'package:flutter_screenutil/flutter_screenutil.dart';void main() {runApp(ScreenUtilInit(designSize: Size(375, 812), // 設計稿尺寸(例如 iPhone X)builder: (context, child) => MyApp(),),);
}class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Container(width: 100.w, // 屏幕適配寬度height: 100.h, // 屏幕適配高度child: Text('Hello', style: TextStyle(fontSize: 16.sp)), // 字體大小適配),),);}
}
其他適配邏輯
插件 功能 適合場景 flutter_screenutil
基于設計稿自動縮放 推薦用于大部分項目 responsive_builder
響應式斷點布局 多平臺(Web、Mobile)適配 flutter_responsive_framework
精準控制不同設備 UI 企業級適配 mediaquery_sizer
類似 screenutil,但更輕量 輕量項目可用