Flutter城市选择器插件city_pickers的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter城市选择器插件city_pickers的使用

city_pickers

中国的城市三级联动选择器,提供多种选择方式,方便用户在应用中选择省市区信息。

Demo

demo1 demo2

沟通QQ群

QQ 群号码: 935915271

开始

在flutter的项目文件中增加依赖:

dependencies:
  ...
  city_pickers: ^1.1.0

关于如何运行flutter项目,请参考官方文档

使用方法

简单使用方法如下:

import 'package:city_pickers/city_pickers.dart';

Future<Result?> getResult() async {
  // 呼出弹出层,显示多级选择器
  Result? result = await CityPickers.showCityPicker(
    context: context,
  );

  // 呼出一层界面, 显示多级选择器
  Result? result2 = await CityPickers.showFullPageCityPicker(
    context: context,
  );

  // 呼出一层, 显示支持字母定位城市选择器
  Result? result3 = await CityPickers.showCitiesSelector(
    context: context,
  );

  return result;
}

CityPickers 静态方法

Name Type Desc
showCityPicker Function 呼出弹出层,显示多级选择器
showFullPageCityPicker Function 呼出一层界面, 显示多级选择器
showCitiesSelector Function 呼出一层, 显示支持字母定位城市选择器
utils Function 获取utils接口的钩子

showCityPicker 参数说明

Name Type Default Desc
context BuildContext - 上下文对象
theme ThemeData Theme.of(context) 主题, 可以自定义
locationCode String “110000” 初始化地址信息, 可以是省, 市, 区的地区码
height double 300 弹出层的高度
showType ShowType ShowType.pca 三级联动, 显示类型
barrierOpacity double 0.5 弹出层的背景透明度
barrierDismissible bool true 是否可以通过点击弹出层背景, 关闭弹出层
cancelWidget Widget - 用户自定义取消按钮
confirmWidget Widget - 用户自定义确认按钮
itemExtent double - 目标框高度
itemBuilder Widget - item生成器
citiesData Map 城市数据 选择器的城市与区的数据源
provincesData Map 省份数据 选择器的省份数据源

showFullPageCityPicker 参数说明

Name Type Default Desc
context BuildContext null 上下文对象
theme ThemeData Theme.of(context) 主题, 可以自定义
locationCode String “110000” 初始化地址信息, 可以是省, 市, 区的地区码
showType ShowType ShowType.pca 三级联动, 显示类型
citiesData Map 城市数据 选择器的城市与区的数据源
provincesData Map 省份数据 选择器的省份数据源

showCitiesSelector 参数说明

Name Type Default Desc
context BuildContext null 上下文对象
theme ThemeData Theme.of(context) 主题, 可以自定义
locationCode String “110000” 初始化地址信息, 可以是省, 市, 区的地区码
title String “城市选择器” 弹出层界面标题
citiesData Map 城市数据 选择器的城市与区的数据源
provincesData Map 省份数据 选择器的省份数据源
hotCities List<HotCity> null 热门城市
sideBarStyle BaseStyle 初始默认样式 右侧字母索引集样式
cityItemStyle BaseStyle 初始默认样式 城市选项样式
topStickStyle BaseStyle 初始默认样式 顶部索引吸顶样式
scaffoldBackgroundColor Colors Colors.white 页面背景色
useSearchAppBar bool false 当AppBarBuilder=null的时候, 控制是否开启搜索框
appBarBuilder Function null 用户自定义AppBar

utils 说明

utils 是用来封装常用的一些方法,方便使用者能更好地使用该插件。使用者通过以下方式声明实例,可以获取所有的工具类方法:

// 声明实例
CityPickerUtil cityPickerUtils = CityPickers.utils();

方法示例

print('result>>> ${cityPickerUtils.getAreaResultByCode('100100')}');

// 输出为: result>>> {"provinceName":"北京市","provinceId":"110000","cityName":"东城区","cityId":"110101"}

数据来源

贡献者

贡献者列表

声明

本项目Example部分代码与样式, 参考借鉴Flutter Goflutter go 是flutter 开发者帮助 APP,包含 flutter 常用 140+ 组件的demo 演示与中文文档

To Do List

  • ✅ 城市选择器, 借鉴点评
  • ✅ 支持拼音等模糊搜索
  • ❌ 加入单元测试

示例代码

以下是完整的示例代码,展示了如何集成和使用 city_pickers 插件。

import 'package:flutter/material.dart';
import 'src/item_container.dart';
import 'view/show_city_picker.dart';
import 'view/wip.dart';
import 'view/show_full_page_picker.dart';
import 'view/util_getLocationInfo.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var useMaterial3 = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        colorScheme: const ColorScheme.light(
          primary: Color(0xFFC91B3A),
          background: Color(0xFFEFEFEF),
          secondary: Color(0xFF888888),
        ),
        textTheme: const TextTheme(
          bodyMedium: TextStyle(color: Color(0xFF888888), fontSize: 16.0),
        ),
        useMaterial3: useMaterial3,
      ),
      darkTheme: ThemeData.dark().copyWith(
        primaryColor: const Color(0xFFC91B3A),
      ),
      themeMode: ThemeMode.system,
      title: 'Welcome to Flutter',
      debugShowCheckedModeBanner: false,
      routes: <String, WidgetBuilder>{
        '/name': (_) => const ShowCityPicker(),
        '/full_page': (_) => const ShowFullPageCityPicker(),
        '/city_select': (_) => const WorkInProgress(),
        '/util_getLocationInfo': (_) => const UtilGetLocationInfo()
      },
      home: Body(
        useMaterial3: useMaterial3,
        onUseMaterial3Changed: (v) => setState(
          () {
            useMaterial3 = v;
          },
        ),
      ),
    );
  }
}

class Body extends StatelessWidget {
  const Body({
    Key? key,
    required this.useMaterial3,
    required this.onUseMaterial3Changed,
  }) : super(key: key);

  final bool useMaterial3;
  final ValueChanged<bool> onUseMaterial3Changed;

  static final List _demoList = [
    {"icon": Icons.place, "name": "ios选择器", "routerName": '/name'},
    {"icon": Icons.fullscreen, "name": "三级全屏选择器", "routerName": '/full_page'},
    {
      "icon": Icons.location_city,
      "name": "城市选择器",
      "routerName": '/city_select'
    },
    {
      "icon": Icons.location_city,
      "name": "内置工具类",
      "routerName": '/util_getLocationInfo'
    },
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('CityPickers Examples'),
          actions: [
            Tooltip(
              message: 'useMaterial3',
              child: Switch(
                value: useMaterial3,
                onChanged: onUseMaterial3Changed,
              ),
            )
          ],
        ),
        body: ItemContainer(
          itemList: _demoList,
        ));
  }
}

以上内容涵盖了 city_pickers 插件的安装、使用方法以及一些高级配置,希望能帮助你快速上手并应用到项目中。如果你有任何问题或建议,欢迎随时提问!


更多关于Flutter城市选择器插件city_pickers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter城市选择器插件city_pickers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用city_pickers插件的一个示例代码案例。city_pickers插件主要用于城市选择器功能,它提供了丰富的数据以及便捷的使用方法。

首先,确保你已经在pubspec.yaml文件中添加了city_pickers依赖:

dependencies:
  flutter:
    sdk: flutter
  city_pickers: ^latest_version  # 请替换为最新的版本号

然后,运行flutter pub get来安装依赖。

接下来,我们来看一个简单的示例,展示如何在Flutter应用中使用city_pickers插件。

import 'package:flutter/material.dart';
import 'package:city_pickers/city_pickers.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'City Picker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CityPickerDemo(),
    );
  }
}

class CityPickerDemo extends StatefulWidget {
  @override
  _CityPickerDemoState createState() => _CityPickerDemoState();
}

class _CityPickerDemoState extends State<CityPickerDemo> {
  String _selectedProvince = '请选择省份';
  String _selectedCity = '请选择城市';
  String _selectedDistrict = '请选择区县';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('City Picker Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('省份: $_selectedProvince'),
            SizedBox(height: 16),
            Text('城市: $_selectedCity'),
            SizedBox(height: 16),
            Text('区县: $_selectedDistrict'),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: () async {
                // 打开省份选择器
                var result = await showPicker(
                  context: context,
                  picker: CityPickerType.province,
                  title: '选择省份',
                  initialSelected: _selectedProvince,
                );
                if (result != null && result.length > 0) {
                  setState(() {
                    _selectedProvince = result[0];
                    _selectedCity = '请选择城市';
                    _selectedDistrict = '请选择区县';
                  });
                  // 根据选中的省份加载城市
                  loadCitiesByProvince(result[0]);
                }
              },
              child: Text('选择省份'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> loadCitiesByProvince(String provinceName) async {
    // 根据选中的省份加载城市数据
    var cities = await CityPickers.getCitiesByProvince(provinceName);
    if (cities != null && cities.isNotEmpty) {
      // 这里可以进一步处理城市数据,比如显示在UI上或者供后续选择
      // 例如,可以弹出一个对话框让用户选择城市,这里为了简化省略了这一步
      // 你可以根据具体需求来实现这部分逻辑
    }
  }
}

在这个示例中,我们做了以下几件事情:

  1. 定义了CityPickerDemo_CityPickerDemoState,用于展示城市选择器。
  2. 使用showPicker函数来弹出省份选择器。
  3. 当用户选择一个省份后,通过CityPickers.getCitiesByProvince函数获取该省份下的所有城市。
  4. 在UI上显示选中的省份,并准备让用户进一步选择城市和区县(尽管在这个示例中没有完整实现城市和区县的选择逻辑,但你可以根据showPicker函数的用法来扩展)。

请注意,这个示例代码是一个基本的框架,你可以根据实际需求进一步扩展和完善,比如添加城市和区县的选择逻辑,处理用户取消选择等情况。

回到顶部