import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:trackoffical_app/pb.dart' as pb; import 'package:trackoffical_app/widget/app_top_bar.dart'; import '../styles/theme.dart'; class _Region{ pb.Region region= pb.Region(); bool isSelected = false; List<_Region> children = []; } class RegionPickController extends GetxController { final List regions = []; final found = [].obs; final inputName = ''.obs; final regionLevel1 = <_Region>[].obs; final regionLevel2 = <_Region>[].obs; @override void onInit() { super.onInit(); for (var one in regions){ if(one.code.contains('0000')){ regionLevel1.add(_Region() ..region = one); } } } onInputRegionName(String name) { final n = name.trim(); inputName.value = n; found.clear(); if (n.isNotEmpty) { for (var one in regions) { if (one.name.contains(name)) { found.add(one); } } } } } class RegionPick extends GetView { const RegionPick({super.key}); static Future show(List data) async { return await Get.to(const RegionPick(), binding: BindingsBuilder(() { var c = RegionPickController(); c.regions.addAll(data); Get.put(c); }))!; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppTopBar( title: Container( decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(20))), child: TextField( decoration: const InputDecoration( hintText: '搜索', border: InputBorder.none, contentPadding: EdgeInsets.fromLTRB(14, 5, 70, 5), isDense: true, ), onChanged: (v) => controller.onInputRegionName(v), maxLines: 1, ), ), automaticallyImplyLeading: true, ), body: Obx(() { if (controller.inputName.value.isEmpty) { return _normalView(controller); } else { return _searchView(controller); } }), ); } Widget _searchView(RegionPickController c) { return ListView.builder( itemCount: c.found.length, itemBuilder: (BuildContext context, int index) { return _foundEle(c.found[index]); }); } Widget _normalView(RegionPickController c) { return Row( children: [ Flexible(child: ListView.builder( itemCount: c.regionLevel1.length, itemBuilder: (BuildContext context, int index) { return _normalEle(c.regionLevel1[index]); }) ), const Divider(height: 1), Flexible(child: ListView.builder( itemCount: c.regionLevel2.length, itemBuilder: (BuildContext context, int index) { return _normalEle(c.regionLevel2[index]); }) ), ], ) ; } List<_Region> _getChildren(_Region data){ var rexStr = data.region.code.replaceAll('0000', '[\\d]{4}'); var rex = RegExp(rexStr); var out = <_Region>[]; for (var one in controller.regions){ if(one.code == data.region.code){ continue; } if(one.code.contains(rex)){ out.add(_Region()..region = one); } } return out; } Widget _normalEle(_Region data) { var bkColor = !data.isSelected? Colors.white:Colors.grey; return GestureDetector( onTap: () { var l = _getChildren(data); if(l.isEmpty){ Get.back(result: data.region); }else{ controller.regionLevel2.clear(); controller.regionLevel2.addAll(l); } }, child: Container( color: bkColor, padding: const EdgeInsets.only(left: 12, top: 12, bottom: 12), width: double.infinity, child: Text(data.region.name), ), ); } } Widget _foundEle(pb.Region data) { return GestureDetector( onTap: () => Get.back(result: data), child: Container( padding: const EdgeInsets.only(left: 12), height: 48, width: double.infinity, child: Column( children: [ Text(data.name), const Divider() ], ), ), ); } void main() async { var c = RegionPickController(); var regions = [pb.Region()..name= '济南']; c.regions.addAll(regions); Get.put(c); runApp(GetMaterialApp(theme: appThemeData(), home: const RegionPick())); }