import 'dart:convert'; import 'package:azlistview/azlistview.dart'; import 'package:flutter/services.dart'; import 'package:lpinyin/lpinyin.dart'; import 'package:new_recook/utils/hive_store.dart'; import 'package:new_recook/utils/text_utils.dart'; import 'package:new_recook/widget/weather/weather_city_model.dart'; class WeatherCityTool { WeatherCityTool._(); static WeatherCityTool? _instance; static List cityList = []; static WeatherCityTool? getInstance() { if (_instance == null) { _instance = WeatherCityTool._(); } return _instance; } Future getCityList() async { if (cityList.length > 0) return cityList; String jsonString = ""; if(HiveStore.appBox.get('weatherCity')==null){ jsonString = await rootBundle.loadString("assets/json/weatherCity.json"); HiveStore.appBox.put('weatherCity', jsonString); }else{ jsonString = HiveStore.appBox.get('weatherCity'); } List sourceJson = json.decode(jsonString); cityList = sourceJson.map((m) => WeatherCityModel.fromJson(m)).toList(); _handleList(cityList); return cityList; } _handleList(List list) { if (list.isEmpty) return; for (int i = 0, length = list.length; i < length; i++) { String pinyin = PinyinHelper.getPinyinE(list[i].cityZh!); String tag = pinyin.substring(0, 1).toUpperCase(); list[i].namePinyin = pinyin; list[i].provinceZhPingyin = PinyinHelper.getPinyinE(list[i].provinceZh!); if (RegExp("[A-Z]").hasMatch(tag)) { list[i].tagIndex = tag; } else { list[i].tagIndex = "#"; } } SuspensionUtil.sortListBySuspensionTag(list); } searchWithQuery(String query, Function(List) searchBack) { WeatherCityTool.getInstance()!.getCityList().then((list) { if (!(list is List) || TextUtils.isEmpty(query)) { searchBack([]); } List modelList = list; List resultList = modelList.where((item) { if (item.cityZh!.startsWith(query) || item.namePinyin!.toLowerCase().startsWith(query.toLowerCase()) || item.provinceZh!.startsWith(query) || item.provinceZhPingyin! .toLowerCase() .startsWith(query.toLowerCase())) { return true; } return false; }).toList(); searchBack(resultList); }); } }