Flutter azlistview城市列表页面

城市列表页面效果

请添加图片描述

在根目录pubspec.yaml文件中添加依赖

dependencies:
    azlistview: ^1.1.1
    lpinyin: ^2.0.3
import 'package:flutter/material.dart';
import 'city_page.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("azlistview"),
        ),
        body: CityHome(),
      ),
    );
  }
}

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

  @override
  _CityHomeState createState() => _CityHomeState();
}

class _CityHomeState extends State<CityHome> {
  String city = '深圳市';
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      child: Padding(
        padding: EdgeInsets.all(50),
        child: Row(children: [
          Text(city),
          Icon(
            Icons.expand_more,
            color: Colors.grey,
            size: 26,
          )
        ]),
      ),
      onTap: () => _jumpToCity(),
    );
  }

  void _jumpToCity() async {
    String result = await NavigatorUtil.push(context, CityPage(city: city));
    setState(() {
      city = result;
    });
  }
}

class NavigatorUtil {
  //跳转页面
  static push(BuildContext context, Widget page) async {
    final result = await Navigator.push(
        context, MaterialPageRoute(builder: (context) => page));
    return result;
  }
}

调用CityPage 类

import 'dart:convert';
import 'package:azlistview/azlistview.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lpinyin/lpinyin.dart';

class CityPage extends StatefulWidget {
  final String city;

  const CityPage({Key key,this.city}) : super(key: key);

  @override
  _CityPageState createState() => _CityPageState();
}

const CITY_NAME_LIST = ['北京市', '广州市', '成都市', '深圳市', '杭州市', '武汉市'];

class _CityPageState extends State<CityPage> {
  List<CityModel> cityList = [];
  List<CityModel> _hotCityList = [];

  @override
  void initState() {
    super.initState();
    CITY_NAME_LIST.forEach((value) {
      _hotCityList.add(CityModel(name: value, tagIndex: '★'));
    });
    cityList.addAll(_hotCityList);
    SuspensionUtil.setShowSuspensionStatus(cityList);
    Future.delayed(Duration(milliseconds: 16), () {
      loadData();
    });
  }

  void loadData() {
    rootBundle.loadString('assets/data/china.json').then((value) {
      cityList.clear();
      Map countyMap = json.decode(value);
      List list = countyMap['china'];
      list.forEach((v) {
        cityList.add(CityModel.fromJson(v));
      });
      _handleList(cityList);
    });
  }

  void _handleList(List<CityModel> list) {
    if (list.isEmpty) return;
    for (int i = 0, length = list.length; i < length; i++) {
      String pinyin = PinyinHelper.getPinyinE(list[i].name);
      String tag = pinyin.substring(0, 1).toUpperCase();
      list[i].namePinyin = pinyin;
      if (RegExp("[A-Z]").hasMatch(tag)) {
        list[i].tagIndex = tag;
      } else {
        list[i].tagIndex = "#";
      }
    }

    // A-Z sort.
    SuspensionUtil.sortListBySuspensionTag(list);

    // add hotCityList.
    cityList.insertAll(0, _hotCityList);

    // show sus tag.
    SuspensionUtil.setShowSuspensionStatus(cityList);

    setState(() {});
  }

  Widget header() {
    return Container(
      color: Colors.white,
      height: 44.0,
      child: Row(
        children: <Widget>[
          Expanded(
            child: TextField(
              autofocus: false,
              decoration: InputDecoration(
                contentPadding: EdgeInsets.only(left: 10, right: 10),
                border: InputBorder.none,
                labelStyle: TextStyle(fontSize: 14, color: Color(0xFF333333)),
                hintText: '城市中文名或拼音',
                hintStyle: TextStyle(
                  fontSize: 14,
                  color: Color(0xFFCCCCCC),
                ),
              ),
            ),
          ),
          Container(
            width: 0.33,
            height: 14.0,
            color: Color(0xFFEFEFEF),
          ),
          InkWell(
            onTap: () {
              Navigator.pop(context, widget.city);
            },
            child: Padding(
              padding: const EdgeInsets.all(10.0),
              child: Text(
                "取消",
                style: TextStyle(color: Color(0xFF999999), fontSize: 14),
              ),
            ),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      body: SafeArea(
        child: Column(
          children: [
            header(),
            Expanded(
              child: Material(
                color: Color(0x80000000),
                child: Card(
                  clipBehavior: Clip.hardEdge,
                  margin: const EdgeInsets.only(left: 8, top: 8, right: 8),
                  shape: const RoundedRectangleBorder(
                    borderRadius: const BorderRadius.only(
                      topLeft: Radius.circular(4.0),
                      topRight: Radius.circular(4.0),
                    ),
                  ),
                  child: Column(
                    children: [
                      Container(
                        alignment: Alignment.centerLeft,
                        padding: const EdgeInsets.only(left: 15.0),
                        height: 50.0,
                        child: Text("当前城市: ${widget.city}"),
                      ),
                      Expanded(
                        child: AzListView(
                          data: cityList,
                          itemCount: cityList.length,
                          itemBuilder: (BuildContext context, int index) {
                            CityModel model = cityList[index];
                            return Utils.getListItem(context, model);
                          },
                          padding: EdgeInsets.zero,
                          susItemBuilder: (BuildContext context, int index) {
                            CityModel model = cityList[index];
                            String tag = model.getSuspensionTag();
                            return Utils.getSusItem(context, tag);
                          },
                          indexBarData: ['★', ...kIndexBarData],
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class CityModel extends ISuspensionBean {
  String name;
  String tagIndex;
  String namePinyin;

  CityModel({
     this.name,
    this.tagIndex,
    this.namePinyin,
  });

  CityModel.fromJson(Map<String, dynamic> json) : name = json['name'];

  Map<String, dynamic> toJson() => {
        'name': name,
      };

  @override
  String getSuspensionTag() => tagIndex;

  @override
  String toString() => json.encode(this);
}

class Utils {
  static Widget getSusItem(BuildContext context, String tag,
      {double susHeight = 40}) {
    if (tag == '★') {
      tag = '★ 热门城市';
    }
    return Container(
      height: susHeight,
      width: MediaQuery.of(context).size.width,
      padding: EdgeInsets.only(left: 16.0),
      color: Color(0xFFF3F4F5),
      alignment: Alignment.centerLeft,
      child: Text(
        '$tag',
        softWrap: false,
        style: TextStyle(
          fontSize: 14.0,
          color: Color(0xFF666666),
        ),
      ),
    );
  }

  static Widget getListItem(BuildContext context, CityModel model,
      {double susHeight = 40}) {
    return ListTile(
      title: Text(model.name),
      onTap: () {
        Navigator.pop(context, model.name);
      },
    );
  }
}

数据存储assets/data/china.json

pubspec.yaml文件中添加china.json引用路径

  assets:
    - assets/data/

china.json文件

{"china":[{"name":"北京市"},{"name":"天津市"},{"name":"石家庄市"},{"name":"唐山市"},{"name":"秦皇岛市"},{"name":"邯郸市"},{"name":"邢台市"},{"name":"保定市"},{"name":"张家口市"},{"name":"承德市"},{"name":"沧州市"},{"name":"廊坊市"},{"name":"衡水市"},{"name":"太原市"},{"name":"大同市"},{"name":"阳泉市"},{"name":"长治市"},{"name":"晋城市"},{"name":"朔州市"},{"name":"晋中市"},{"name":"运城市"},{"name":"忻州市"},{"name":"临汾市"},{"name":"吕梁市"},{"name":"呼和浩特市"},{"name":"包头市"},{"name":"乌海市"},{"name":"赤峰市"},{"name":"通辽市"},{"name":"鄂尔多斯市"},{"name":"呼伦贝尔市"},{"name":"巴彦淖尔市"},{"name":"乌兰察布市"},{"name":"兴安盟"},{"name":"锡林郭勒盟"},{"name":"阿拉善盟"},{"name":"沈阳市"},{"name":"大连市"},{"name":"鞍山市"},{"name":"抚顺市"},{"name":"本溪市"},{"name":"丹东市"},{"name":"锦州市"},{"name":"营口市"},{"name":"阜新市"},{"name":"辽阳市"},{"name":"盘锦市"},{"name":"铁岭市"},{"name":"朝阳市"},{"name":"葫芦岛市"},{"name":"长春市"},{"name":"吉林市"},{"name":"四平市"},{"name":"辽源市"},{"name":"通化市"},{"name":"白山市"},{"name":"松原市"},{"name":"白城市"},{"name":"延边朝鲜族自治州"},{"name":"哈尔滨市"},{"name":"齐齐哈尔市"},{"name":"鸡西市"},{"name":"鹤岗市"},{"name":"双鸭山市"},{"name":"大庆市"},{"name":"伊春市"},{"name":"佳木斯市"},{"name":"七台河市"},{"name":"牡丹江市"},{"name":"黑河市"},{"name":"绥化市"},{"name":"大兴安岭地区"},{"name":"上海市"},{"name":"南京市"},{"name":"无锡市"},{"name":"徐州市"},{"name":"常州市"},{"name":"苏州市"},{"name":"南通市"},{"name":"连云港市"},{"name":"淮安市"},{"name":"盐城市"},{"name":"扬州市"},{"name":"镇江市"},{"name":"泰州市"},{"name":"宿迁市"},{"name":"杭州市"},{"name":"宁波市"},{"name":"温州市"},{"name":"嘉兴市"},{"name":"湖州市"},{"name":"绍兴市"},{"name":"金华市"},{"name":"衢州市"},{"name":"舟山市"},{"name":"台州市"},{"name":"丽水市"},{"name":"合肥市"},{"name":"芜湖市"},{"name":"蚌埠市"},{"name":"淮南市"},{"name":"马鞍山市"},{"name":"淮北市"},{"name":"铜陵市"},{"name":"安庆市"},{"name":"黄山市"},{"name":"滁州市"},{"name":"阜阳市"},{"name":"宿州市"},{"name":"巢湖市"},{"name":"六安市"},{"name":"亳州市"},{"name":"池州市"},{"name":"宣城市"},{"name":"福州市"},{"name":"厦门市"},{"name":"莆田市"},{"name":"三明市"},{"name":"泉州市"},{"name":"漳州市"},{"name":"南平市"},{"name":"龙岩市"},{"name":"宁德市"},{"name":"南昌市"},{"name":"景德镇市"},{"name":"萍乡市"},{"name":"九江市"},{"name":"新余市"},{"name":"鹰潭市"},{"name":"赣州市"},{"name":"吉安市"},{"name":"宜春市"},{"name":"抚州市"},{"name":"上饶市"},{"name":"济南市"},{"name":"青岛市"},{"name":"淄博市"},{"name":"枣庄市"},{"name":"东营市"},{"name":"烟台市"},{"name":"潍坊市"},{"name":"济宁市"},{"name":"泰安市"},{"name":"威海市"},{"name":"日照市"},{"name":"莱芜市"},{"name":"临沂市"},{"name":"德州市"},{"name":"聊城市"},{"name":"滨州市"},{"name":"菏泽市"},{"name":"郑州市"},{"name":"开封市"},{"name":"洛阳市"},{"name":"平顶山市"},{"name":"安阳市"},{"name":"鹤壁市"},{"name":"新乡市"},{"name":"焦作市"},{"name":"濮阳市"},{"name":"许昌市"},{"name":"漯河市"},{"name":"三门峡市"},{"name":"南阳市"},{"name":"商丘市"},{"name":"信阳市"},{"name":"周口市"},{"name":"驻马店市"},{"name":"武汉市"},{"name":"黄石市"},{"name":"十堰市"},{"name":"宜昌市"},{"name":"襄樊市"},{"name":"鄂州市"},{"name":"荆门市"},{"name":"孝感市"},{"name":"荆州市"},{"name":"黄冈市"},{"name":"咸宁市"},{"name":"随州市"},{"name":"恩施土家族苗族自治州"},{"name":"仙桃市"},{"name":"潜江市"},{"name":"天门市"},{"name":"神农架林区"},{"name":"长沙市"},{"name":"株洲市"},{"name":"湘潭市"},{"name":"衡阳市"},{"name":"邵阳市"},{"name":"岳阳市"},{"name":"常德市"},{"name":"张家界市"},{"name":"益阳市"},{"name":"郴州市"},{"name":"永州市"},{"name":"怀化市"},{"name":"娄底市"},{"name":"湘西土家族苗族自治州"},{"name":"广州市"},{"name":"韶关市"},{"name":"深圳市"},{"name":"珠海市"},{"name":"汕头市"},{"name":"佛山市"},{"name":"江门市"},{"name":"湛江市"},{"name":"茂名市"},{"name":"肇庆市"},{"name":"惠州市"},{"name":"梅州市"},{"name":"汕尾市"},{"name":"河源市"},{"name":"阳江市"},{"name":"清远市"},{"name":"东莞市"},{"name":"中山市"},{"name":"潮州市"},{"name":"揭阳市"},{"name":"云浮市"},{"name":"南宁市"},{"name":"柳州市"},{"name":"桂林市"},{"name":"梧州市"},{"name":"北海市"},{"name":"防城港市"},{"name":"钦州市"},{"name":"贵港市"},{"name":"玉林市"},{"name":"百色市"},{"name":"贺州市"},{"name":"河池市"},{"name":"来宾市"},{"name":"崇左市"},{"name":"海口市"},{"name":"三亚市"},{"name":"重庆市"},{"name":"成都市"},{"name":"自贡市"},{"name":"攀枝花市"},{"name":"泸州市"},{"name":"德阳市"},{"name":"绵阳市"},{"name":"广元市"},{"name":"遂宁市"},{"name":"内江市"},{"name":"乐山市"},{"name":"南充市"},{"name":"眉山市"},{"name":"宜宾市"},{"name":"广安市"},{"name":"达州市"},{"name":"雅安市"},{"name":"巴中市"},{"name":"资阳市"},{"name":"阿坝藏族羌族自治州"},{"name":"甘孜藏族自治州"},{"name":"凉山彝族自治州"},{"name":"贵阳市"},{"name":"六盘水市"},{"name":"遵义市"},{"name":"安顺市"},{"name":"铜仁市"},{"name":"黔西南布依族苗族自治州"},{"name":"毕节市"},{"name":"黔东南苗族侗族自治州"},{"name":"黔南布依族苗族自治州"},{"name":"昆明市"},{"name":"曲靖市"},{"name":"玉溪市"},{"name":"保山市"},{"name":"昭通市"},{"name":"丽江市"},{"name":"思茅市"},{"name":"临沧市"},{"name":"楚雄彝族自治州"},{"name":"红河哈尼族彝族自治州"},{"name":"文山壮族苗族自治州"},{"name":"西双版纳傣族自治州"},{"name":"大理白族自治州"},{"name":"德宏傣族景颇族自治州"},{"name":"怒江傈僳族自治州"},{"name":"迪庆藏族自治州"},{"name":"拉萨市"},{"name":"昌都地区"},{"name":"山南地区"},{"name":"日喀则地区"},{"name":"那曲地区"},{"name":"阿里地区"},{"name":"林芝地区"},{"name":"西安市"},{"name":"铜川市"},{"name":"宝鸡市"},{"name":"咸阳市"},{"name":"渭南市"},{"name":"延安市"},{"name":"汉中市"},{"name":"榆林市"},{"name":"安康市"},{"name":"商洛市"},{"name":"兰州市"},{"name":"嘉峪关市"},{"name":"金昌市"},{"name":"白银市"},{"name":"天水市"},{"name":"武威市"},{"name":"张掖市"},{"name":"平凉市"},{"name":"酒泉市"},{"name":"庆阳市"},{"name":"定西市"},{"name":"陇南市"},{"name":"临夏回族自治州"},{"name":"甘南藏族自治州"},{"name":"西宁市"},{"name":"海东地区"},{"name":"海北藏族自治州"},{"name":"黄南藏族自治州"},{"name":"海南藏族自治州"},{"name":"果洛藏族自治州"},{"name":"玉树藏族自治州"},{"name":"海西蒙古族藏族自治州"},{"name":"银川市"},{"name":"石嘴山市"},{"name":"吴忠市"},{"name":"固原市"},{"name":"中卫市"},{"name":"乌鲁木齐市"},{"name":"克拉玛依市"},{"name":"吐鲁番地区"},{"name":"哈密地区"},{"name":"昌吉回族自治州"},{"name":"博尔塔拉蒙古自治州"},{"name":"巴音郭楞蒙古自治州"},{"name":"阿克苏地区"},{"name":"克孜勒苏柯尔克孜自治州"},{"name":"喀什地区"},{"name":"和田地区"},{"name":"伊犁哈萨克"},{"name":"塔城地区"},{"name":"阿勒泰地区"},{"name":"石河子市"},{"name":"阿拉尔市"},{"name":"图木舒克市"},{"name":"五家渠市"},{"name":"台北"},{"name":"高雄"},{"name":"基隆"},{"name":"台中"},{"name":"台南"},{"name":"新竹"},{"name":"嘉义"},{"name":"宜兰"},{"name":"桃园"},{"name":"苗栗"},{"name":"彰化"},{"name":"南投"},{"name":"云林"},{"name":"屏东"},{"name":"台东"},{"name":"花莲"},{"name":"澎湖"},{"name":"香港岛"},{"name":"九龙"},{"name":"新界"},{"name":"澳门半岛"},{"name":"氹仔岛"},{"name":"路环岛"},{"name":"路氹城"}]}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter BLoC(Business Logic Component)是一种使用单向数据流来管理状态的设计模式。下面是使用Flutter BLoC展示列表的基本步骤: 1.定义Bloc类:定义一个Bloc类来管理应用程序的状态,并处理业务逻辑。该类应该包含一个StreamController来发布状态更改和一个Stream来监听状态变化。 ```dart class ListBloc { final _listController = StreamController<List<String>>.broadcast(); Stream<List<String>> get listStream => _listController.stream; List<String> _list = []; void addToList(String item) { _list.add(item); _listController.sink.add(_list); } void removeFromList(String item) { _list.remove(item); _listController.sink.add(_list); } void dispose() { _listController.close(); } } ``` 2.创建BlocProvider:使用BlocProvider来将Bloc注入到Widget树中,以便在任何地方都可以访问它。 ```dart class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter BLoC Demo', home: BlocProvider<ListBloc>( create: (context) => ListBloc(), child: MyHomePage(), ), ); } } ``` 3.使用BlocBuilder来展示列表:BlocBuilder是Flutter BLoC提供的一个Widget,它会监听Bloc的状态变化,并在状态发生变化时自动重构应用程序UI。 ```dart class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { final listBloc = BlocProvider.of<ListBloc>(context); return Scaffold( appBar: AppBar( title: Text('Flutter BLoC Demo'), ), body: BlocBuilder<ListBloc, List<String>>( builder: (context, list) { return ListView.builder( itemCount: list.length, itemBuilder: (context, index) { return ListTile( title: Text(list[index]), trailing: IconButton( icon: Icon(Icons.delete), onPressed: () { listBloc.removeFromList(list[index]); }, ), ); }, ); }, ), floatingActionButton: FloatingActionButton( onPressed: () { listBloc.addToList('New Item'); }, child: Icon(Icons.add), ), ); } } ``` 这样就可以使用Flutter BLoC展示列表了,当添加或删除列表项时,UI会自动更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值