【Flutter 组件】005-基础组件:单选、开关和复选框
文章目录
- 【Flutter 组件】005-基础组件:单选、开关和复选框
- 一、概述
- 二、基本使用
- 1、开关
- 代码示例
- 运行结果
- 2、复选框
- 代码示例
- 运行结果
- 3、多个选项单选
- 代码示例
- 运行结果
- 4、多个选项多选
- 代码示例
- 运行结果
一、概述
Material 组件库中提供了 Material 风格的单选开关 Switch
和复选框 Checkbox
,虽然它们都是继承自 StatefulWidget
,但它们本身不会保存当前选中状态,选中状态都是由父组件来管理的。当Switch
或Checkbox
被点击时,会触发它们的onChanged
回调,我们可以在此回调中处理选中状态改变逻辑。
当需要实现多个选项的单选功能时,可以使用 Radio
和RadioListTile
组件。这些组件允许用户在一组选项中选择一个。
二、基本使用
1、开关
代码示例
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
State<HomePage> createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
bool _value = false;
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Center(
child: Switch(
value: _value,
activeColor: Colors.black,
onChanged: (bool newValue) {
setState(() {
_value = newValue;
});
},
),
),
);
}
}
运行结果
2、复选框
代码示例
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
State<HomePage> createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
bool _value1 = false;
bool _value2 = false;
bool _value3 = false;
bool _value4 = false;
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Column(
children: [
Checkbox(
value: _value1,
onChanged: (bool? newValue) {
setState(() {
_value1 = newValue!;
});
},
),
CheckboxListTile(
title: const Text('Checkbox 2'),
value: _value2,
onChanged: (bool? newValue) {
setState(() {
_value2 = newValue!;
});
},
),
CheckboxMenuButton(
value: _value3,
onChanged: (bool? newValue) {
setState(() {
_value3 = newValue!;
});
},
child: const Text('Checkbox 3')),
CupertinoCheckbox(
value: _value4,
onChanged: (bool? newValue) {
setState(() {
_value4 = newValue!;
});
},
),
],
),
);
}
}
运行结果
3、多个选项单选
代码示例
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
State<HomePage> createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
String? _selectedOption;
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RadioListTile<String>(
title: const Text('Option 1'),
value: 'Option 1',
groupValue: _selectedOption,
onChanged: (String? newValue) {
setState(() {
_selectedOption = newValue;
});
},
),
RadioListTile<String>(
title: const Text('Option 2'),
value: 'Option 2',
groupValue: _selectedOption,
onChanged: (String? newValue) {
setState(() {
_selectedOption = newValue;
});
},
),
RadioListTile<String>(
title: const Text('Option 3'),
value: 'Option 3',
groupValue: _selectedOption,
onChanged: (String? newValue) {
setState(() {
_selectedOption = newValue;
});
},
),
],
),
);
}
}
运行结果
4、多个选项多选
代码示例
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
State<HomePage> createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
final List<String> _selectedOptions = [];
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CheckboxListTile(
title: const Text('Option 1'),
value: _selectedOptions.contains('Option 1'),
onChanged: (bool? value) {
setState(() {
if (value != null && value) {
_selectedOptions.add('Option 1');
} else {
_selectedOptions.remove('Option 1');
}
});
},
),
CheckboxListTile(
title: const Text('Option 2'),
value: _selectedOptions.contains('Option 2'),
onChanged: (bool? value) {
setState(() {
if (value != null && value) {
_selectedOptions.add('Option 2');
} else {
_selectedOptions.remove('Option 2');
}
});
},
),
CheckboxListTile(
title: const Text('Option 3'),
value: _selectedOptions.contains('Option 3'),
onChanged: (bool? value) {
setState(() {
if (value != null && value) {
_selectedOptions.add('Option 3');
} else {
_selectedOptions.remove('Option 3');
}
});
},
),
],
),
);
}
}