it编程 > App开发 > flutter

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

2人参与 2026-09-21 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:文本显示组件

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.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:图标组件

4. elevatedbutton:按钮组件

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:文本输入框组件

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:线性布局组件

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:容器组件

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:堆叠布局组件

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:可滚动的列表组件

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:网格布局组件

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:卡片组件

card(
  elevation: 5,
  shape: roundedrectangleborder(
    borderradius: borderradius.circular(10),
  ),
  child: padding(
    padding: edgeinsets.all(16),
    child: text('this is a card'),
  ),
)

4. 状态管理类

表单组件

组件说明示例代码
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_frameworkflutter_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常用组件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Flutter表单处理与验证各种用法和高级技巧

09-18

nacos开启鉴权与配置加密实践

08-19

这篇文章一次讲清Flutter组件之间如何传值

08-19

Flutter给图片添加多行文字水印的三种实现方案

03-05

Flutter配置unable to locate android sdk.问题及解决

02-11

在鸿蒙上使用webview_flutter包的详细示例

02-07

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论