flutter常用组件详细介绍、屏幕适配方案、常用目录设计方案(附实例)

 更新时间:2026年09月21日 08:33:01   作者:初遇你时动了情  
Flutter是一款开源的UI软件开发工具包,由Google开发和维护,这篇文章主要介绍了flutter常用组件详细介绍、屏幕适配方案、常用目录设计方案的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、常用组件

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,
)


属性类型说明
dataString显示的文本内容
styleTextStyle字体大小、颜色、行高等
textAlignTextAlign文本对齐(left、right、center、justify)
maxLinesint最大显示行数
overflowTextOverflow溢出处理: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,
)
属性类型说明
imageImageProvider图片数据,如 AssetImage, NetworkImage
width / heightdouble宽/高
fitBoxFit缩放方式:fill、cover、contain、fitWidth、fitHeight
repeatImageRepeat是否重复显示图片
alignmentAlignment对齐方式

3. Icon:图标组件

  • 功能:用于显示图标。
  • 常用属性:
  • icon:图标数据,如 Icons.home。
  • size:图标大小。
  • color:图标颜色。
  • 示例
    Icon(
      Icons.home,
      size: 30,
      color: Colors.green,
    )

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)),
	  ),
	)
属性类型说明
onPressedFunction()按钮点击事件
childWidget按钮内容
styleButtonStyle自定义样式:背景色、形状、边距

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');
  },
)
属性类型说明
controllerTextEditingController控制器(获取/设置输入值)
decorationInputDecoration输入框装饰
obscureTextbool是否隐藏内容(密码输入)
keyboardTypeTextInputType键盘类型:text、number、email 等
maxLengthint最大输入长度
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、decorationContainer(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),
  ],
)
属性类型说明
childrenList<Widget>子组件列表
mainAxisAlignmentMainAxisAlignment主轴对齐
crossAxisAlignmentCrossAxisAlignment交叉轴对齐
mainAxisSizeMainAxisSize主轴占用空间(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 / heightdouble宽高
padding / marginEdgeInsets内/外边距
decorationBoxDecoration背景、边框、阴影、圆角等
alignmentAlignment子组件对齐方式
childWidget子组件

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),
    ),
  ],
)
属性类型说明
alignmentAlignment默认子组件对齐方式
childrenList<Widget>子组件列表
fitStackFit子组件如何填充 Stack

CustomScrollView 滚动组件

复杂滚动页面,可组合多个 Sliver(静态+动态+吸顶)

CustomScrollView 适用场景
  • 首页复杂页面,比如:
  • 顶部轮播图
  • 宫格菜单
  • 限时活动
  • 吸顶一级/二级菜单
  • 底部商品瀑布流
CustomScrollView(
  slivers: [
    SliverToBoxAdapter(child: BannerWidget()),
    SliverToBoxAdapter(child: GridMenuWidget()),
    SliverPersistentHeader(
      pinned: true,
      delegate: StickyTabbarDelegate(),
    ),
    SliverStaggeredGrid.countBuilder(
      crossAxisCount: 2,
      itemCount: productList.length,
      itemBuilder: (context, index) => ProductItemWidget(product: productList[index]),
      staggeredTileBuilder: (index) => StaggeredTile.fit(1),
    ),
  ],
)

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'),
    );
  },
)

属性类型说明
childrenList<Widget>静态子组件列表
itemBuilderIndexedWidgetBuilder构建子项
itemCountint子项数量
scrollDirectionAxis滚动方向(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,
      ),
    );
  }),
)

属性类型说明
crossAxisCountint横轴显示个数
mainAxisSpacingdouble主轴间距
crossAxisSpacingdouble横轴间距
childAspectRatiodouble宽高比

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(...)
响应式组件封装根据屏幕宽度切换 UIresponsive_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 {
  @override
  Widget 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,但更轻量轻量项目可用

常用目录设计方案

lib/
├─ main.dart                 # 程序入口
├─ common/                   # 公共工具、样式、API
│   ├─ api.dart              # 接口请求统一管理
│   ├─ constants.dart        # 常量、枚举
│   ├─ utils/                # 工具类(日期、网络、加密等)
│   └─ styles/               # 主题、颜色、字体、全局样式
│
├─ widgets/                  # 全局可复用组件(跨页面)
│   ├─ custom_button.dart    # 通用按钮
│   ├─ empty_view.dart       # 空状态占位
│   ├─ loading_more.dart     # 加载更多动画
│   └─ custom_appbar.dart    # 顶部通用 AppBar
│
├─ pages/                    # 页面模块
│   ├─ home/                 # 首页模块
│   │   ├─ home_page.dart
│   │   ├─ widgets/          # 仅首页专属组件
│   │   │   ├─ notice_bar.dart
│   │   │   ├─ banner_carousel.dart
│   │   │   ├─ menu_grid.dart
│   │   │   ├─ waterfall_list.dart
│   │   │   └─ tab_section.dart
│   │   └─ home_controller.dart # 状态管理(Provider / Riverpod)
│   │
│   ├─ product/              # 商品模块
│   │   ├─ product_page.dart
│   │   ├─ widgets/          # 商品页面专属组件
│   │   │   ├─ product_card.dart
│   │   │   ├─ product_filter.dart
│   │   │   └─ product_banner.dart
│   │   └─ product_controller.dart
│   │
│   └─ mine/                 # 个人中心模块
│       ├─ mine_page.dart
│       └─ widgets/
│           └─ user_info_card.dart
│
└─ routes/                   # 路由统一管理
    └─ app_routes.dart

结构说明

common/

放项目全局可用的工具、常量、样式和接口

类似前端的 utils/ 或 services/

widgets/

全局复用组件,不属于某个页面

例:按钮、加载动画、空状态组件

pages/

每个页面/模块独立一个目录

内部 widgets/ 只放该页面的专属组件

页面逻辑、状态管理、子组件都归属本模块

routes/

页面路由统一管理,便于导航和跳转

总结

到此这篇关于flutter常用组件详细介绍、屏幕适配方案、常用目录设计方案的文章就介绍到这了,更多相关flutter常用组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 网站性能分析优化实例(网站加载慢)

    网站性能分析优化实例(网站加载慢)

    网站性能分析优化实例(网站加载慢),本文详细讲解网站性能优化的三大方向:传输、体积和加载,涵盖CDN、HTTP/2、压缩等技术,结合实战案例展示如何将加载时间从3分钟压缩至118毫秒,强调分析与工具的重要性
    2025-07-07
  • 本地搭建DeepSeek-R1、WebUI的完整过程及访问

    本地搭建DeepSeek-R1、WebUI的完整过程及访问

    这篇文章主要介绍了本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主要用于大语言模型的本地部署和管理,通过Docker和Ollama工具,用户可以在自己的服务器上运行DeepSeek-R1,并通过WebUI交互和测试,需要的朋友可以参考下
    2025-02-02
  • 前端图片加载失败、 img出现裂图的原因超详细解析

    前端图片加载失败、 img出现裂图的原因超详细解析

    这篇文章主要介绍了前端图片加载失败、 img出现裂图原因的相关资料,图片加载失败主要由路径错误、格式问题、浏览器缓存、图片过大和编码问题导致,需要的朋友可以参考下
    2026-02-02
  • redis debug环境搭建过程详解(使用clion)

    redis debug环境搭建过程详解(使用clion)

    这篇文章给大家介绍redis debug环境搭建过程,使用clion,达到和调试java一样的效果,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • 详解git submodule HEAD detached 的问题

    详解git submodule HEAD detached 的问题

    这篇文章主要介绍了详解git submodule HEAD detached 的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • OpenSSL生成v3证书方法及配置文件详解

    OpenSSL生成v3证书方法及配置文件详解

    本文主要介绍了OpenSSL生成v3证书方法及配置文件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • DeepSeek本机部署详细步骤(基于Ollama和Docker管理)

    DeepSeek本机部署详细步骤(基于Ollama和Docker管理)

    这篇文章主要介绍了如何利用ollama和docker在本机部署DeepSeek大语言模型,提供了一种高效、便捷且稳定的部署方式,步骤包括硬件和软件安装、模型获取、容器创建和启动等,通过图文介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • EventStore文件存储设计详解

    EventStore文件存储设计详解

    ENode是一个CQRS+Event Sourcing架构的开发框架,这篇文章主要介绍了EventStore文件存储设计 ,需要的朋友可以参考下
    2019-05-05
  • 关于HTTPS的TSL握手

    关于HTTPS的TSL握手

    这篇文章主要介绍了关于HTTPS的TSL握手,HTTP一般基于TCP协议,而HTTPS就是在这之间加了SSL/TLS协议,那么在TCP三次握手建立TCP连接后,就需要TLS握手建立SSL/TLS连接,需要的朋友可以参考下
    2023-04-04
  • 分享18个最佳代码编辑器/IDE开发工具

    分享18个最佳代码编辑器/IDE开发工具

    这篇文章主要为开发人员收录了18个最好的代码编辑器/IDE工具,希望你会喜欢
    2014-05-05

最新评论