flutter城市选择页面

2023-11-19

在这里插入图片描述
在这里插入图片描述

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 {
  @override
  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;
  @override
  void initState() {
    super.initState();
    loadData();
  }

  @override
  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)});
        });
      }
    }
  }

  @override
  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;
  }
}

调用

Map<String, dynamic> _selectCity;
var result = await NavigatorUtil.push(CitySearchPage());
            if (result != null) {
              setState(() {
                _selectCity = result;
              });
            }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter城市选择页面 的相关文章

随机推荐

  • Linux C++: error: redefinition of ‘class xxx’ 的解决方法

    我在Ubuntu上写C 运行程序时遇到error ThinkBook 15p data150 study projects 0408 g g src cpp I include o bin test01 In file included f
  • L - Candy Machine(二分+贪心)

    题意 大体就是查找大于等于这个选定集合的平均值个数的数 选定集合 分析 前提就是这个集合有序 这个可以反着理解当最后一个数加上前缀必然使平均值降低 然后大于平均的增多 不断贪心求最大 代码 include
  • IDEA使用Gradle报错:你的主机中的软件中止了一个已建立的连接

    问题详情 问题解决 关闭电脑的热点分享 再重新加载项目即可
  • 什么是HIS、PACS、LIS、RIS

    HIS 医院bai信息系统 Hospital Information System HIS 利用电子计算机和通讯设备du 为医院所属各部门提zhi供病人诊疗信息dao和行政管理信息的收集 存储 处理 提取和数据交换的能力 并满足所有授权用户
  • dubbo分布式服务

    架构 节点角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次调和调用时间的监控中心 Container 服务运行容器 调
  • Linux磁盘管理命令大全

    1 cd命令 Linux cd命令用于切换当前工作目录至 dirName 目录参数 其中 dirName 表示法可为绝对路径或相对路径 若目录名称省略 则变换至使用者的 home 目录 也就是刚 login 时所在的目录 另外 也表示为 h
  • RedHat7.2系统中安装snmp工具并配置服务

    简单介绍 snmpwalk是SNMP的一个工具 用户可以通过snmpwalk查看支持SNMP协议设备的一些信息 比如IP地址 内存使用率等 snmpwalk是一款比较好用的采集系统信息的工具 安装snmp工具 输入以下指令安装软件包 以普通
  • 常用的 Druid 参数

    Druid 参数 连接池初始化大小 最大连接数 最小空闲连接数这几个连接数有什么作用 他们的关系是怎么样的 初始连接数如果都被占用了 连接池会创建最小空闲数个连接吗 官网 Druid Database for modern analytic
  • 机器学习技术(八)——朴素贝叶斯算法实操

    机器学习技术 八 朴素贝叶斯算法实操 文章目录 机器学习技术 八 朴素贝叶斯算法实操 一 引言 二 导入相关依赖库 三 读取并查看数据 四 数据预处理 五 构建两种模型进行比较 1 只考虑Dayofweek以及District 2 加入犯罪
  • 高校校园网建设方案【含网络拓扑图+拓扑结构图+配置命令】(详细版)

    xxx大学xxx校区网络整体规划设计方案 目 录 一 项目综述 1 1 1学校概况 1 1 1 1 1 1 2建设目标 1 1 2 1 概述 1 1 2 2 具体目标 1 1 3建设原则 1 1 3 1 概述 1 1 3 2 具体原则 2
  • Ubuntu20.04安装g3log、glog和gflags

    建议最好先安装最新版本的cmake 在进行以下安装 cmake安装教程 1 安装gflags 方法一 首先打开终端 git clone https github com gflags gflags git cd gflags mkdir b
  • C++ Pat甲级1011 World Cup Betting (20 分)

    1011 World Cup Betting 20 分 With the 2010 FIFA World Cup running football fans the world over were becoming increasingly
  • 常见的常微分方程的一般解法

    本文归纳常见的常微分方程的一般解法 如果没有出现意外 本文将不包含解法的推导过程 常微分方程 我们一般可以将其归纳为如下n类 可分离变量的微分方程 一阶 一阶齐次 非齐次 线性微分方程 一阶 包含伯努利 二阶常系数微分方程 二阶 高阶常系数
  • kafka如何保证数据可靠性和数据一致性

    数据可靠性 Kafka 作为一个商业级消息中间件 消息可靠性的重要性可想而知 本文从 Producter 往 Broker 发送消息 Topic 分区副本以及 Leader 选举几个角度介绍数据的可靠性 Producer 往 Broker
  • SIFT和SURF的替换算法——ORB (Oriented FAST and Rotated BRIEF 快速定向和旋转)

    SIFT和SURF的替代算法 ORB Oriented FAST and Rotated BRIEF 快速定向和旋转 1 效果图 2 源码 参考 1 用于关键点检测和描述的SIFT Scale Invariant Feature Trans
  • Faster R-CNN系列之MATLAB篇

    我发现 我是个懒人 不对 我一直是个懒人 但是 电光火石间 不知怎么地 我决定 我写个博客吧 我是废话的分割线 最开始接触Faster R CNN 先尝试跑的其实是PYTHON版 但是编译过程中出错了 我又从来没接触过python 自己稍稍
  • 【INS-30014】无法检查指定的位置是否位于CFS上的解决办法

    安装oracle数据库过程中 出现 INS 30014 无法检查指定的位置是否位于CFS上的解决办法如下 安装过程中 选择 仅安装数据库软件 在安装成功后 使用DBCA工具创建以及配置数据库即可
  • Oracle:数据库设计三大范式

    数据库设计三大范式 为什么要谈及范式 这也是为了数据库设计做准备 对于表设计而言 我们需求何种程度的设计 这完全取决你数据的规模 好比你建房子 要是建个一两层 基本上不需要什么设计 直接开工就行 要是建个这样的房子还找设计公司的话 这无疑是
  • 安装win7后怎么装linux系统,小编教你如何使用u盘安装Linux系统

    第二步 u盘安装Linux 1 U盘插到要安装Linux的电脑上后 启动电脑 在启动时 一直按F2键 就能进入到主板的BIOS控制界面 按左右键移动到boot选项 然后按上下键到removeable device选项 再按 号移动它的位置在
  • flutter城市选择页面

    import dart convert import package test http DioManager dart import package test http api life api dart import package t