Flutter中新手需要掌握的几种Widget

1. 按功能分类的核心 Widget

布局类 Widget

作用: 控制其他 Widget 的排列和位置

Dart 复制代码
// Row - 水平排列
Row(
  children: [Text('A'), Text('B'), Text('C')],
)

// Column - 垂直排列
Column(
  children: [Text('A'), Text('B'), Text('C')],
)

// Stack - 层叠布局
Stack(
  children: [
    Container(color: Colors.blue),
    Positioned(
      top: 10,
      child: Text('Overlay'),
    ),
  ],
)

// Expanded - 填充剩余空间
Row(
  children: [
    Container(width: 50, color: Colors.red),
    Expanded(
      child: Container(color: Colors.blue),
    ),
  ],
)

基础显示 Widget

作用: 显示内容和信息

Dart 复制代码
// Text - 文本显示
Text(
  'Hello World',
  style: TextStyle(fontSize: 16, color: Colors.black),
)

// Image - 图片显示
Image.asset('assets/logo.png') // 本地图片
Image.network('https://example.com/image.jpg') // 网络图片

// Icon - 图标
Icon(Icons.star, color: Colors.yellow)

// Container - 多功能容器
Container(
  width: 100,
  height: 100,
  margin: EdgeInsets.all(10),
  padding: EdgeInsets.all(20),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(8),
  ),
  child: Text('Content'),
)

交互类 Widget

作用: 接收用户输入和交互

Dart 复制代码
// 按钮系列
ElevatedButton(
  onPressed: () => print('Clicked'),
  child: Text('Elevated Button'),
)

TextButton(
  onPressed: () {},
  child: Text('Text Button'),
)

IconButton(
  onPressed: () {},
  icon: Icon(Icons.favorite),
)

// 输入框
TextField(
  decoration: InputDecoration(
    labelText: '用户名',
    hintText: '请输入用户名',
  ),
  onChanged: (value) => print(value),
)

// 开关
Switch(
  value: _isOn,
  onChanged: (value) => setState(() => _isOn = value),
)

// 复选框
Checkbox(
  value: _isChecked,
  onChanged: (value) => setState(() => _isChecked = value),
)

列表和网格 Widget

作用: 显示可滚动的列表数据

Dart 复制代码
// ListView - 列表
ListView(
  children: [
    ListTile(title: Text('Item 1')),
    ListTile(title: Text('Item 2')),
    ListTile(title: Text('Item 3')),
  ],
)

// ListView.builder - 动态列表
ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(title: Text(items[index]));
  },
)

// GridView - 网格
GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2, // 每行2个
  ),
  itemCount: 20,
  itemBuilder: (context, index) {
    return Card(child: Center(child: Text('Item $index')));
  },
)

2. 按状态分类的 Widget

StatelessWidget - 无状态组件

特点: 一旦创建,内容不会改变

Dart 复制代码
class MyText extends StatelessWidget {
  final String content;
  
  MyText({required this.content});
  
  @override
  Widget build(BuildContext context) {
    return Text(content);
  }
}

// 使用
MyText(content: 'Hello World')

StatefulWidget - 有状态组件

特点: 可以管理内部状态,状态改变时会重新构建

Dart 复制代码
class Counter extends StatefulWidget {
  @override
  _CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Count: $_count'),
        ElevatedButton(
          onPressed: _increment,
          child: Text('Add'),
        ),
      ],
    );
  }
}

3. 页面结构类 Widget

Scaffold - 页面脚手架

作用: 提供标准的页面结构

Dart 复制代码
Scaffold(
  appBar: AppBar(
    title: Text('My App'),
    actions: [
      IconButton(icon: Icon(Icons.search), onPressed: () {}),
    ],
  ),
  body: Center(
    child: Text('Page Content'),
  ),
  drawer: Drawer( // 侧边栏
    child: ListView(
      children: [ListTile(title: Text('Menu 1'))],
    ),
  ),
  bottomNavigationBar: BottomNavigationBar(
    items: [
      BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
      BottomNavigationBarItem(icon: Icon(Icons.settings), label: 'Settings'),
    ],
  ),
  floatingActionButton: FloatingActionButton(
    onPressed: () {},
    child: Icon(Icons.add),
  ),
)

AppBar - 应用栏

Dart 复制代码
AppBar(
  title: Text('页面标题'),
  backgroundColor: Colors.blue,
  elevation: 4, // 阴影
  actions: [
    IconButton(icon: Icon(Icons.share), onPressed: () {}),
  ],
)

4. 样式和装饰 Widget

Dart 复制代码
// Padding - 内边距
Padding(
  padding: EdgeInsets.all(16),
  child: Text('有内边距的文本'),
)

// Center - 居中
Center(
  child: Text('居中文本'),
)

// SizedBox - 固定尺寸
SizedBox(
  width: 200,
  height: 100,
  child: ElevatedButton(onPressed: () {}, child: Text('按钮')),
)

// Card - 卡片
Card(
  elevation: 5,
  child: Padding(
    padding: EdgeInsets.all(16),
    child: Text('卡片内容'),
  ),
)

5. 导航类 Widget

Dart 复制代码
// 在 build 方法中使用
ElevatedButton(
  onPressed: () {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => SecondPage()),
    );
  },
  child: Text('跳转到第二页'),
)

学习路径建议

  1. 第一阶段:掌握 Text、Container、Column、Row、Button

  2. 第二阶段:学习 ListView、GridView、TextField

  3. 第三阶段:理解 StatefulWidget 和状态管理

  4. 第四阶段:掌握 Scaffold 和完整的页面结构

  5. 第五阶段:学习导航和路由

这些 Widget 是 Flutter 开发的基石,熟练掌握后就能构建出功能完整的应用界面

相关推荐
ssshooter1 小时前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
四眼肥鱼4 小时前
flutter 利用flutter_libserialport 实现SQ800 串口通信
前端·flutter
二流小码农5 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少5 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker5 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋6 小时前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我19 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
王晓枫20 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
开心就好202520 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
开心就好20251 天前
免 Xcode 的 iOS 开发新选择?聊聊一款更轻量的 iOS 开发 IDE kxapp 快蝎
后端·ios