flutter如何实现级联选择器
在Flutter中如何实现级联选择器?目前需要开发一个多级联动的选择功能,比如省市区三级联动,但不知道用什么组件或方案比较合适。有没有现成的插件推荐,或者需要自己封装实现?希望能提供具体的代码示例或实现思路。
2 回复
在Flutter中实现级联选择器可以通过以下几种方式:
1. 使用官方 flutter_cupertino_picker(iOS风格)
import 'package:flutter/cupertino.dart';
List<String> provinces = ['北京', '上海', '广东'];
Map<String, List<String>> cities = {
'北京': ['朝阳区', '海淀区', '西城区'],
'上海': ['黄浦区', '徐汇区', '长宁区'],
'广东': ['广州市', '深圳市', '东莞市']
};
void showCascadePicker(BuildContext context) {
int provinceIndex = 0;
int cityIndex = 0;
showCupertinoModalPopup(
context: context,
builder: (context) {
return Container(
height: 200,
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
CupertinoButton(
child: Text('取消'),
onPressed: () => Navigator.pop(context),
),
CupertinoButton(
child: Text('确定'),
onPressed: () {
print('选择: ${provinces[provinceIndex]} - ${cities[provinces[provinceIndex]]![cityIndex]}');
Navigator.pop(context);
},
),
],
),
Expanded(
child: Row(
children: [
Expanded(
child: CupertinoPicker(
itemExtent: 32,
onSelectedItemChanged: (index) {
provinceIndex = index;
cityIndex = 0;
},
children: provinces.map((province) => Text(province)).toList(),
),
),
Expanded(
child: CupertinoPicker(
itemExtent: 32,
onSelectedItemChanged: (index) {
cityIndex = index;
},
children: cities[provinces[provinceIndex]]!.map((city) => Text(city)).toList(),
),
),
],
),
),
],
),
);
},
);
}
2. 使用第三方库 flutter_picker
在 pubspec.yaml 中添加依赖:
dependencies:
flutter_picker: ^2.1.15
使用示例:
import 'package:flutter_picker/flutter_picker.dart';
void showFlutterPicker(BuildContext context) {
Picker(
adapter: PickerDataAdapter<String>(pickerdata: [
['北京', '上海', '广东'],
['朝阳区', '海淀区', '西城区']
]),
hideHeader: false,
title: Text('请选择地区'),
onConfirm: (Picker picker, List value) {
print(value.toString());
print(picker.getSelectedValues());
},
).showDialog(context);
}
3. 自定义级联选择器
class CascadePicker extends StatefulWidget {
@override
_CascadePickerState createState() => _CascadePickerState();
}
class _CascadePickerState extends State<CascadePicker> {
String selectedProvince = '北京';
String selectedCity = '朝阳区';
@override
Widget build(BuildContext context) {
return Column(
children: [
DropdownButton<String>(
value: selectedProvince,
onChanged: (String? newValue) {
setState(() {
selectedProvince = newValue!;
selectedCity = cities[newValue]!.first;
});
},
items: provinces.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
DropdownButton<String>(
value: selectedCity,
onChanged: (String? newValue) {
setState(() {
selectedCity = newValue!;
});
},
items: cities[selectedProvince]!.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
],
);
}
}
推荐方案
- 简单需求:使用 DropdownButton 组合
- iOS风格:使用 flutter_cupertino_picker
- 复杂需求:使用 flutter_picker 第三方库
这些方法都能实现级联选择功能,具体选择取决于你的设计需求和平台适配要求。


