Flutter 常用控件大全:从入门到实战,全面掌握 UI 开发

发布于:2025-03-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

本文详细整理了 Flutter 中 50+ 常用控件,涵盖文本、布局、按钮、列表、动画等核心组件。每个控件均附有 属性说明实战代码示例,帮助你快速掌握 Flutter UI 开发的精髓。无论你是初学者还是进阶开发者,本文都能为你提供实用的参考和指导,助你轻松构建美观、高效的 Flutter 应用!


1. Text

用于显示文本内容。

属性:

  • text: 显示的文本内容。
  • style: 文本样式(字体大小、颜色、粗细等)。

示例:

Text(
  'Hello, Flutter!',
  style: TextStyle(
    fontSize: 24,
    fontWeight: FontWeight.bold,
    color: Colors.blue,
  ),
)

2. Container

用于布局和装饰,可以设置宽度、高度、边距、背景色等。

属性:

  • widthheight: 容器的宽度和高度。
  • marginpadding: 外边距和内边距。
  • decoration: 装饰(背景色、边框、圆角等)。

示例:

Container(
  width: 200,
  height: 100,
  margin: EdgeInsets.all(10),
  padding: EdgeInsets.all(20),
  decoration: BoxDecoration(
    color: Colors.amber,
    borderRadius: BorderRadius.circular(10),
  ),
  child: Text('Container'),
)

3. Row 和 Column

用于水平(Row)和垂直(Column)排列子控件。

属性:

  • mainAxisAlignment: 主轴对齐方式(如 MainAxisAlignment.spaceEvenly)。
  • crossAxisAlignment: 交叉轴对齐方式(如 CrossAxisAlignment.start)。

示例:

Row(
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  children: [
    Text('Item 1'),
    Text('Item 2'),
    Text('Item 3'),
  ],
)

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: [
    Text('Item 1'),
    Text('Item 2'),
    Text('Item 3'),
  ],
)

4. ListView

用于显示可滚动的列表。

属性:

  • children: 列表项。
  • scrollDirection: 滚动方向(默认垂直)。

示例:

ListView(
  children: [
    ListTile(
      title: Text('Item 1'),
    ),
    ListTile(
      title: Text('Item 2'),
    ),
    ListTile(
      title: Text('Item 3'),
    ),
  ],
)

5. GridView

用于显示网格布局。

属性:

  • crossAxisCount: 每行的列数。
  • children: 网格项。

示例:

GridView.count(
  crossAxisCount: 2,
  children: List.generate(10, (index) {
    return Center(
      child: Text('Item $index'),
    );
  }),
)

6. Button

用于触发操作,如 ElevatedButtonTextButtonIconButton 等。

属性:

  • onPressed: 点击事件回调。
  • child: 按钮内容。

示例:

ElevatedButton(
  onPressed: () {
    print('Button Pressed');
  },
  child: Text('Click Me'),
)

IconButton(
  icon: Icon(Icons.thumb_up),
  onPressed: () {
    print('Icon Button Pressed');
  },
)

7. TextField

用于接收用户输入。

属性:

  • decoration: 输入框装饰(如标签、边框)。
  • onChanged: 输入内容变化时的回调。

示例:

TextField(
  decoration: InputDecoration(
    labelText: 'Enter your name',
    border: OutlineInputBorder(),
  ),
  onChanged: (text) {
    print('User input: $text');
  },
)

8. Image

用于显示图片。

属性:

  • src: 图片路径(网络或本地)。
  • widthheight: 图片尺寸。
  • fit: 图片填充方式(如 BoxFit.cover)。

示例:

Image.network(
  'https://example.com/image.jpg',
  width: 200,
  height: 200,
  fit: BoxFit.cover,
)

9. AppBar

用于显示应用栏。

属性:

  • title: 标题。
  • actions: 右侧操作按钮。

示例:

Scaffold(
  appBar: AppBar(
    title: Text('My App'),
    actions: [
      IconButton(
        icon: Icon(Icons.search),
        onPressed: () {
          print('Search');
        },
      ),
    ],
  ),
  body: Center(
    child: Text('Hello, Flutter!'),
  ),
)

10. BottomNavigationBar

用于底部导航栏。

属性:

  • items: 导航项。
  • currentIndex: 当前选中的索引。
  • onTap: 点击事件回调。

示例:

Scaffold(
  bottomNavigationBar: BottomNavigationBar(
    items: const [
      BottomNavigationBarItem(
        icon: Icon(Icons.home),
        label: 'Home',
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.business),
        label: 'Business',
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.school),
        label: 'School',
      ),
    ],
    currentIndex: 0,
    onTap: (index) {
      print('Selected index: $index');
    },
  ),
  body: Center(
    child: Text('Hello, Flutter!'),
  ),
)

11. SnackBar

用于显示轻量级的提示信息。

属性:

  • content: 提示内容。
  • duration: 显示时长。

示例:

Scaffold(
  body: Center(
    child: ElevatedButton(
      onPressed: () {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('This is a SnackBar!'),
          ),
        );
      },
      child: Text('Show SnackBar'),
    ),
  ),
)

12. AlertDialog

用于显示对话框。

属性:

  • title: 对话框标题。
  • content: 对话框内容。
  • actions: 操作按钮。

示例:

showDialog(
  context: context,
  builder: (BuildContext context) {
    return AlertDialog(
      title: Text('Alert'),
      content: Text('This is an alert dialog.'),
      actions: [
        TextButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          child: Text('OK'),
        ),
      ],
    );
  },
);

13. Stack

用于将多个控件叠加在一起。

属性:

  • children: 子控件。

示例:

Stack(
  children: [
    Container(
      width: 200,
      height: 200,
      color: Colors.red,
    ),
    Positioned(
      top: 50,
      left: 50,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.blue,
      ),
    ),
  ],
)

14. Expanded

用于在 RowColumn 中扩展子控件。

属性:

  • flex: 扩展比例。

示例:

Row(
  children: [
    Expanded(
      flex: 2,
      child: Container(
        color: Colors.red,
        height: 100,
      ),
    ),
    Expanded(
      flex: 1,
      child: Container(
        color: Colors.blue,
        height: 100,
      ),
    ),
  ],
)

15. FutureBuilder

用于处理异步数据并构建 UI。

属性:

  • future: 异步任务。
  • builder: 根据任务状态构建 UI。

示例:

FutureBuilder<String>(
  future: fetchData(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return CircularProgressIndicator();
    } else if (snapshot.hasError) {
      return Text('Error: ${snapshot.error}');
    } else {
      return Text('Data: ${snapshot.data}');
    }
  },
)

16. StreamBuilder

用于处理流数据并构建 UI。

属性:

  • stream: 数据流。
  • builder: 根据流数据构建 UI。

示例:

StreamBuilder<int>(
  stream: streamCounter(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text('Count: ${snapshot.data}');
    } else {
      return Text('No data');
    }
  },
)

17. GestureDetector

用于处理手势事件。

属性:

  • onTap: 点击事件回调。
  • child: 子控件。

示例:

GestureDetector(
  onTap: () {
    print('Tapped');
  },
  child: Container(
    width: 100,
    height: 100,
    color: Colors.green,
    child: Center(
      child: Text('Tap Me'),
    ),
  ),
)

18. Hero

用于实现页面之间的共享元素过渡动画。

属性:

  • tag: 共享元素的唯一标识。
  • child: 共享元素的内容。

示例:

Hero(
  tag: 'hero-tag',
  child: Image.network(
    'https://example.com/image.jpg',
    width: 100,
    height: 100,
  ),
)

19. AnimatedContainer

用于创建带有动画效果的容器。

属性:

  • duration: 动画时长。
  • widthheight: 容器的宽度和高度。
  • color: 背景色。

示例:

AnimatedContainer(
  duration: Duration(seconds: 1),
  width: _width,
  height: _height,
  color: _color,
  child: Center(
    child: Text('Animated Container'),
  ),
)

20. CustomPaint

用于自定义绘制。

属性:

  • painter: 自定义绘制逻辑。

示例:

CustomPaint(
  size: Size(200, 200),
  painter: MyCustomPainter(),
)

21. ClipRRect

用于裁剪控件为圆角矩形。

属性:

  • borderRadius: 圆角半径。
  • child: 子控件。

示例:

ClipRRect(
  borderRadius: BorderRadius.circular(20),
  child: Image.network(
    'https://example.com/image.jpg',
    width: 200,
    height: 200,
    fit: BoxFit.cover,
  ),
)

22. Transform

用于对控件进行变换(旋转、缩放、平移等)。

属性:

  • angle: 旋转角度。
  • child: 子控件。

示例:

Transform.rotate(
  angle: 45 * (3.141592653589793 / 180),
  child: Container(
    width: 100,
    height: 100,
    color: Colors.blue,
  ),
)

23. Flexible

用于在 RowColumn 中灵活分配空间。

属性:

  • flex: 扩展比例。
  • child: 子控件。

示例:

Row(
  children: [
    Flexible(
      flex: 1,
      child: Container(
        color: Colors.red,
        height: 100,
      ),
    ),
    Flexible(
      flex: 2,
      child: Container(
        color: Colors.blue,
        height: 100,
      ),
    ),
  ],
)

24. Spacer

用于在 RowColumn 中创建空白空间。

属性:

  • flex: 空白空间的比例。

示例:

Row(
  children: [
    Text('Left'),
    Spacer(),
    Text('Right'),
  ],
)

25. Divider

用于添加分割线。

属性:

  • height: 分割线高度。
  • color: 分割线颜色。

示例:

Column(
  children: [
    Text('Item 1'),
    Divider(),
    Text('Item 2'),
  ],
)

26. CircularProgressIndicator

用于显示加载指示器。

属性:

  • valueColor: 进度条颜色。

示例:

CircularProgressIndicator(
  valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
)

27. LinearProgressIndicator

用于显示线性进度条。

属性:

  • value: 进度值(0 到 1 之间)。
  • valueColor: 进度条颜色。

示例:

LinearProgressIndicator(
  value: 0.5,
  valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
)

28. Checkbox

用于选择或取消选择选项。

属性:

  • value: 是否选中。
  • onChanged: 状态变化回调。

示例:

Checkbox(
  value: _isChecked,
  onChanged: (value) {
    setState(() {
      _isChecked = value!;
    });
  },
)

29. Radio

用于单选选项。

属性:

  • value: 单选值。
  • groupValue: 当前选中的值。
  • onChanged: 状态变化回调。

示例:

Radio(
  value: 1,
  groupValue: _selectedValue,
  onChanged: (value) {
    setState(() {
      _selectedValue = value!;
    });
  },
)

30. Switch

用于切换开关状态。

属性:

  • value: 开关状态。
  • onChanged: 状态变化回调。

示例:

Switch(
  value: _isSwitched,
  onChanged: (value) {
    setState(() {
      _isSwitched = value;
    });
  },
)

31. Slider

用于选择范围内的值。

属性:

  • value: 当前值。
  • minmax: 最小值和最大值。
  • onChanged: 值变化回调。

示例:

Slider(
  value: _sliderValue,
  min: 0,
  max: 100,
  onChanged: (value) {
    setState(() {
      _sliderValue = value;
    });
  },
)

32. DatePicker

用于选择日期。

属性:

  • initialDate: 初始���期。
  • firstDatelastDate: 可选日期范围。

示例:

showDatePicker(
  context: context,
  initialDate: DateTime.now(),
  firstDate: DateTime(2000),
  lastDate: DateTime(2100),
).then((selectedDate) {
  if (selectedDate != null) {
    print('Selected Date: $selectedDate');
  }
});

33. TimePicker

用于选择时间。

属性:

  • initialTime: 初始时间。

示例:

showTimePicker(
  context: context,
  initialTime: TimeOfDay.now(),
).then((selectedTime) {
  if (selectedTime != null) {
    print('Selected Time: $selectedTime');
  }
});

34. Drawer

用于显示侧边栏。

属性:

  • child: 侧边栏内容。

示例:

Scaffold(
  drawer: Drawer(
    child: ListView(
      children: [
        DrawerHeader(
          child: Text('Drawer Header'),
          decoration: BoxDecoration(
            color: Colors.blue,
          ),
        ),
        ListTile(
          title: Text('Item 1'),
          onTap: () {
            print('Item 1 tapped');
          },
        ),
        ListTile(
          title: Text('Item 2'),
          onTap: () {
            print('Item 2 tapped');
          },
        ),
      ],
    ),
  ),
  body: Center(
    child: Text('Hello, Flutter!'),
  ),
)

35. TabBar

用于显示标签栏。

属性:

  • tabs: 标签项。
  • controller: 标签控制器。

示例:

DefaultTabController(
  length: 3,
  child: Scaffold(
    appBar: AppBar(
      bottom: TabBar(
        tabs: [
          Tab(icon: Icon(Icons.home)),
          Tab(icon: Icon(Icons.business)),
          Tab(icon: Icon(Icons.school)),
        ],
      ),
    ),
    body: TabBarView(
      children: [
        Center(child: Text('Home')),
        Center(child: Text('Business')),
        Center(child: Text('School')),
      ],
    ),
  ),
)

36. Stepper

用于显示步骤指示器。

属性:

  • currentStep: 当前步骤。
  • steps: 步骤列表。

示例:

Stepper(
  currentStep: _currentStep,
  onStepContinue: () {
    setState(() {
      if (_currentStep < 2) {
        _currentStep += 1;
      }
    });
  },
  onStepCancel: () {
    setState(() {
      if (_currentStep > 0) {
        _currentStep -= 1;
      }
    });
  },
  steps: [
    Step(
      title: Text('Step 1'),
      content: Text('Content for Step 1'),
    ),
    Step(
      title: Text('Step 2'),
      content: Text('Content for Step 2'),
    ),
    Step(
      title: Text('Step 3'),
      content: Text('Content for Step 3'),
    ),
  ],
)

37. Chip

用于显示标签或选择项。

属性:

  • label: 标签内容。
  • onDeleted: 删除回调。

示例:

Chip(
  label: Text('Chip'),
  onDeleted: () {
    print('Chip deleted');
  },
)

38. Tooltip

用于显示提示信息。

属性:

  • message: 提示信息内容。
  • child: 子控件。

示例:

Tooltip(
  message: 'This is a tooltip',
  child: Text('Hover over me'),
)

39. RichText

用于显示富文本。

属性:

  • text: 富文本内容(使用 TextSpan 定义)。

示例:

RichText(
  text: TextSpan(
    text: 'Hello ',
    style: TextStyle(color: Colors.black),
    children: <TextSpan>[
      TextSpan(
        text: 'Flutter',
        style: TextStyle(
          color: Colors.blue,
          fontWeight: FontWeight.bold,
        ),
      ),
    ],
  ),
)

40. Wrap

用于自动换行的布局。

属性:

  • spacing: 子控件之间的间距。
  • runSpacing: 行之间的间距。
  • children: 子控件。

示例:

Wrap(
  spacing: 8.0,
  runSpacing: 4.0,
  children: List.generate(10, (index) {
    return Chip(
      label: Text('Item $index'),
    );
  }),
)

41. FadeInImage

用于显示带有淡入效果的图片。

属性:

  • placeholder: 占位图。
  • image: 目标图片。
  • fit: 图片填充方式。

示例:

FadeInImage.assetNetwork(
  placeholder: 'assets/placeholder.png',
  image: 'https://example.com/image.jpg',
  width: 200,
  height: 200,
  fit: BoxFit.cover,
)

42. PageView

用于显示可滑动的页面。

属性:

  • children: 页面内容。

示例:

PageView(
  children: [
    Center(child: Text('Page 1')),
    Center(child: Text('Page 2')),
    Center(child: Text('Page 3')),
  ],
)

43. RefreshIndicator

用于下拉刷新。

属性:

  • onRefresh: 刷新回调。
  • child: 子控件。

示例:

RefreshIndicator(
  onRefresh: () async {
    await Future.delayed(Duration(seconds: 2));
  },
  child: ListView(
    children: [
      ListTile(
        title: Text('Item 1'),
      ),
      ListTile(
        title: Text('Item 2'),
      ),
      ListTile(
        title: Text('Item 3'),
      ),
    ],
  ),
)

44. ClipOval

用于裁剪控件为圆形。

属性:

  • child: 子控件。

示例:

ClipOval(
  child: Image.network(
    'https://example.com/image.jpg',
    width: 100,
    height: 100,
    fit: BoxFit.cover,
  ),
)

45. ClipPath

用于自定义裁剪路径。

属性:

  • clipper: 自定义裁剪逻辑。
  • child: 子控件。

示例:

ClipPath(
  clipper: MyCustomClipper(),
  child: Container(
    width: 200,
    height: 200,
    color: Colors.blue,
  ),
)

46. BackdropFilter

用于应用背景滤镜。

属性:

  • filter: 滤镜效果(如模糊)。
  • child: 子控件。

示例:

BackdropFilter(
  filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
  child: Container(
    color: Colors.black.withOpacity(0.5),
  ),
)

47. ShaderMask

用于应用着色器遮罩。

属性:

  • shaderCallback: 着色器逻辑。
  • child: 子控件。

示例:

ShaderMask(
  shaderCallback: (Rect bounds) {
    return LinearGradient(
      colors: [Colors.red, Colors.blue],
    ).createShader(bounds);
  },
  child: Text(
    'Shader Mask',
    style: TextStyle(fontSize: 24, color: Colors.white),
  ),
)

48. AnimatedOpacity

用于创建带有动画效果的透明度变化。

属性:

  • opacity: 透明度值(0 到 1 之间)。
  • duration: 动画时长。
  • child: 子控件。

示例:

AnimatedOpacity(
  opacity: _opacity,
  duration: Duration(seconds: 1),
  child: Container(
    width: 200,
    height: 200,
    color: Colors.blue,
  ),
)

49. AnimatedCrossFade

用于在两个控件之间创建交叉淡入淡出动画。

属性:

  • duration: 动画时长。
  • firstChildsecondChild: 两个子控件。
  • crossFadeState: 当前显示的控件。

示例:

AnimatedCrossFade(
  duration: Duration(seconds: 1),
  firstChild: Container(
    width: 200,
    height: 200,
    color: Colors.blue,
  ),
  secondChild: Container(
    width: 200,
    height: 200,
    color: Colors.red,
  ),
  crossFadeState: _showFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond,
)

50. AnimatedBuilder

用于创建自定义动画。

属性:

  • animation: 动画控制器。
  • builder: 构建动画逻辑。
  • child: 子控件。

示例:

AnimatedBuilder(
  animation: _animationController,
  builder: (context, child) {
    return Transform.rotate(
      angle: _animationController.value * 2 * 3.141592653589793,
      child: child,
    );
  },
  child: Container(
    width: 100,
    height: 100,
    color: Colors.blue,
  ),
)

总结

以上是 Flutter 中 50 个常用控件的详细说明和示例代码。通过灵活组合这些控件,你可以构建出功能丰富、界面美观的 Flutter 应用。希望这些内容对你有帮助!如果有其他问题,欢迎随时提问!