flutter城市选择页面

这篇具有很好参考价值的文章主要介绍了flutter城市选择页面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flutter 城市选择器,flutter
flutter 城市选择器,flutter

import 'dart:convert';

import 'package:test/http/DioManager.dart';
import 'package:test/http/api/life_api.dart';
import 'package:test/util/hex_color.dart';
import 'package:test/widget/custom_appbar.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

class CitySearchPage extends StatefulWidget {
  
  State<StatefulWidget> createState() => _CitySearchPageState();
}

class _CitySearchPageState extends State<CitySearchPage> {
  List<Map<String, dynamic>> _cityList = List();
  List<Map<String, dynamic>> _hotCityList = List();
  List<Map<String, dynamic>> _searchList = List();

  final TextEditingController cityController = new TextEditingController();

  Dio _dio = DioManager.getInstance().dio;

  bool _isSearching = false;
  
  void initState() {
    super.initState();
    loadData();
  }

  
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  void loadData() async {
    _hotCityList.add({
      "id": 1101,
      "parentId": 11,
      "name": "北京市",
      "cityCode": "010",
      "level": 2,
      "letter": "B"
    });
    _hotCityList.add({
      "id": 3101,
      "parentId": 31,
      "name": "上海市",
      "cityCode": "021",
      "level": 2,
      "letter": "S"
    });
    _hotCityList.add({
      "id": 4401,
      "parentId": 44,
      "name": "广州市",
      "cityCode": "020",
      "level": 2,
      "letter": "G"
    });
    _hotCityList.add({
      "id": 3301,
      "parentId": 33,
      "name": "杭州市",
      "cityCode": "0571",
      "level": 2,
      "letter": "H"
    });
    _hotCityList.add({
      "id": 4403,
      "parentId": 44,
      "name": "深圳市",
      "cityCode": "0755",
      "level": 2,
      "letter": "S"
    });

    //加载城市列表
    Response response = await _dio.get(LifeApi.LIFE_QUERY_CITY_LIST);
    if (response.statusCode == 200 && response.data['code'] == 200) {
      if (mounted) {
        setState(() {
          response.data['data'].forEach((element) => {_cityList.add(element)});
        });
      }
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: CustomAppBar(
          backgroundColor: HexColor('##5dc8b6'),
          leading: IconButton(
            onPressed: () {
              Navigator.pop(context);
            },
            icon: Icon(
              Icons.arrow_back_ios,
              color: HexColor('#ffffff'),
            ),
          ),
          title: const Text('选择城市'),
          centerTitle: true,
          bottom: PreferredSize(
            preferredSize: const Size.fromHeight(42.0),
            child: Theme(
              data: Theme.of(context)
                  .copyWith(accentColor: Theme.of(context).accentColor),
              child: Container(
                height: 42,
                margin: EdgeInsets.only(left: 10.0, right: 10.0, bottom: 6.0),
                decoration: BoxDecoration(
                    color: Color(0xfff3f4f5),
                    borderRadius: BorderRadius.circular(5)),
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: TextFormField(
                        controller: cityController,
                        decoration: InputDecoration(
                          hintText: '请输入城市',
                          border: InputBorder.none,
                          prefixIcon: Icon(
                            Icons.search,
                          ),
                        ),
                        onChanged: (value) {
                          if (value != null && value.length > 0) {
                            _searchList.clear();

                            for (Map<String, dynamic> element in _cityList) {
                              if (element['letter'].contains(value)) {
                                element['cityList'].forEach((item) => {
                                  _searchList.add(item)
                                });
                              } else {
                                element['cityList'].forEach((item) => {
                                  if (item['name'].contains(value)) {
                                    _searchList.add(item)
                                  }
                                });
                              }
                            }

                            setState(() {
                              _isSearching = true;
                              _searchList;
                            });
                          } else {
                            setState(() {
                              _isSearching = false;
                            });
                          }
                        },
                      ),
                    ),
                    InkWell(
                      onTap: () {
                        setState(() {
                          cityController.value = TextEditingValue(text: "");
                          setState(() {
                            _isSearching = false;
                          });
                          FocusScope.of(context).requestFocus(FocusNode());
                        });
                      },
                      child: Icon(
                        Icons.clear,
                        size: 22,
                        color: Colors.grey,
                      ),
                    ),
                    SizedBox(
                      width: 6.0,
                    )
                  ],
                ),
              ),
            ),
          ),
        ),
        body: Stack(
          children: <Widget>[
            Offstage(
              offstage: !_isSearching,
              child: ListView.separated(
                itemCount: _searchList.length == 0 ? 1 : _searchList.length,
                itemBuilder: (context, index) {
                  if (_searchList.length > 0) {
                    return ListTile(
                      title: Text(_searchList[index]['name']),
                      onTap: () {
                        Navigator.pop(context, _searchList[index]);
                      },
                    );
                  } else {
                    return Container(
                      margin: EdgeInsets.only(top: 40.0),
                      child: Center(
                        child: Text(
                          "无法查询到城市",
                          style: TextStyle(fontSize: 16.0, color: Colors.grey),
                        ),
                      ),
                    );
                  }
                },
                separatorBuilder: (context, index) {
                  return Divider(height: 0.0, thickness: 0.0, indent: 0);
                },
              ),
            ),
            Offstage(
              offstage: _isSearching,
              child: ListView(
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.fromLTRB(0, 30.h, 0, 0),
                    child: Column(
                      children: _cityItem(),
                    ),
                  )
                ],
              ),
            ),
          ],
        ));
  }

  _cityItem() {
    List<Widget> list = [];
    _cityList.forEach((element) => {
          list.add(Container(
            child: Column(
              children: _cityItemList(element),
            ),
          ))
        });
    return list;
  }

  _cityItemList(Map<String, dynamic> element) {
    List<Widget> list = [];
    list.add(Container(
      width: double.infinity,
      height: 40.h,
      padding: EdgeInsets.only(left: 40.w, right: 40.w),
      color: Colors.black.withOpacity(0.1),
      alignment: Alignment.centerLeft,
      child: Text('${element['letter']}'),
    ));

    element['cityList'].forEach((item) => {
          list.add(GestureDetector(
            onTap: () {
              Navigator.pop(context, item);
            },
            child: Container(
              width: double.infinity,
              height: 80.h,
              padding: EdgeInsets.only(left: 40.w, right: 40.w),
              color: Colors.white,
              alignment: Alignment.centerLeft,
              child: Text('${item['name']}'),
            ),
          ))
        });

    return list;
  }
}

调用文章来源地址https://www.toymoban.com/news/detail-692293.html

Map<String, dynamic> _selectCity;
var result = await NavigatorUtil.push(CitySearchPage());
            if (result != null) {
              setState(() {
                _selectCity = result;
              });
            }

到了这里,关于flutter城市选择页面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue 中国城市选择器的使用 element-china-area-data

    本文参考:element-china-area-data - npm   1. 安装 2. 使用 provinceAndCityData是省市二级联动数据(不带“全部”选项) regionData是省市区三级联动数据(不带“全部”选项) provinceAndCityDataPlus是省市区三级联动数据(带“全部”选项) regionDataPlus是省市区三级联动数据(带“全部”选

    2024年02月16日
    浏览(28)
  • uni-app微信小程序结合腾讯地图获取定位导航以及城市选择器

    目录 第一步:登录小程序公众平台==设置==第三方设置  第二步:登录腾讯地图申请属于自己小程序的key  第三步:找到腾讯地图的插件​​​​​​​  第四步:添加插件与允许授权  第五步:使用    腾讯地图后台:https://lbs.qq.com/dev/console/application/mine    添加key,授权使

    2023年04月12日
    浏览(58)
  • Axure网页端高交互组件库11套, 下拉菜单文件上传穿梭框日期城市选择器

    组件数量:共 11 套 兼容软件:Axure RP 9/10,不支持低版本 应用领域:web端原型设计、桌面端原型设计 本作品为「web端组件库」,高保真高交互 (带仿真功能效果);运用了动态面板、中继器、变量值,可以自定义数据;主要包括表单类和选择器,一共11套组件。 表单类有:输

    2024年01月17日
    浏览(32)
  • 【Flutter】Flutter 图片选择器入门:如何使用 image_picker 插件从图库选择图片、拍摄新照片

    🎉想要精通 Flutter,掌握更多技巧和最佳实践?好消息来了!👉 Flutter专栏-Flutter Developer 101 入门小册 正在等你!📚 🔍这里有你需要的所有 Flutter 学习资源,包括代码示例和深度解析。🎯 ⏰专栏内容持续更新࿰

    2024年02月14日
    浏览(48)
  • 【Flutter】Flutter 使用splashscreen包创建启动页面

    大家好,今天我们要聊一聊如何在 Flutter 中使用 splashscreen 包来创建一个漂亮的启动页面。启动页面在许多应用中都是非常重要的一部分,它能够给用户留下深刻的第一印象,并且可以在应用加载数据或者进行初始化操作的时候为用户提供一个视觉效果。 如果你想深入学习

    2024年02月08日
    浏览(61)
  • 封装flutter webview页面

    例如在flutter里面跳转百度页面 需要安装webview_flutter webview_page.dart 使用

    2024年02月03日
    浏览(33)
  • Flutter 学习之图片的选择、裁切、保存

    在Flutter中,我们可以通过调用系统的图片选择器来选择一张图片,也可以通过使用插件来实现图片的裁切和保存。 Flutter提供了ImagePicker插件来实现图片选择功能。为了使用该插件,我们需要在pubspec.yaml文件中添加依赖: 然后在需要使用图片选择器的地方,比如一个按钮的点

    2024年02月09日
    浏览(44)
  • 【Flutter】自定义分段选择器Slider

    在开发一个APP的时候,需要用到一个分段选择器,系统的不满足就自己自定义了一个; 可以自定义节点的数量、自定义节点的大小、自定义滑竿的粗细,自定义气泡的有无等等… 基本上满足你的常用需求。 1、使用 2、获取进度条的值 获取当前进度条的值参与计算等业务;

    2024年02月08日
    浏览(30)
  • Flutter自定义下拉选择框dropDownMenu

    利用 PopupMenuButton 和 PopupMenuItem 写了个下拉选择框,之所以不采用系统的,是因为自定义的更能适配项目需求,话不多说,直接看效果 下面直接贴出代码、代码中注释写的都很清楚,使用起来应该很方便,如果有任何问题,欢迎下方留言… 使用 简书地址如果喜欢,希望给个

    2024年04月11日
    浏览(26)
  • Flutter如何知道页面/组件可见?

    在以前项目中,onPageShow和onPageHide由开源框架flutter_boost提供,在此次项目中,创新性的采用了fusion框架,fusion框架同样提供了类似的方法,但在实践中发现,当flutter页面相互replace或者多次pop页面后,onPageShow不会调用,这就导致了诸多bug,于是,需要探索如何了解一个widget

    2024年02月12日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包