List 在dart中为搜索代理查询地图的元素

List 在dart中为搜索代理查询地图的元素,list,flutter,dart,hashmap,List,Flutter,Dart,Hashmap,我在Dart上有一张复杂的地图,结构如下 { "India":["Mumbai","Delhi"], "Australia":["Sydney","Perth" ,"Queensland" ], "USA":["LA","New York"] } 我正在flifter中使用搜索委托实现搜索。但

我在Dart上有一张复杂的地图,结构如下

{
"India":["Mumbai","Delhi"],
"Australia":["Sydney","Perth" ,"Queensland" ],
 "USA":["LA","New York"]

}
我正在flifter中使用搜索委托实现搜索。但无法使用编辑文本查询数据

在上面的例子中,我试图通过乡村的城市进行搜索。我该怎么做? 例如,如果用户键入M,则带有M字母的城市应显示国家名称


非常感谢。

您只需在地图上迭代,然后列表的值如下所示:

Map<String, List<String>> dataMap = {}; // your data map above
String query; // your search query
List<String> list = []; // list to store the results

if (query.isNotEmpty) {
  dataMap.forEach((country, cities) {
    cities.forEach((city) {
      if (city.toLowerCase().startsWith(query.toLowerCase())) {
        list.add('$city, $country');
      }
    });
  });
}
以下是工作示例:

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return OutlinedButton.icon(
      icon: Icon(Icons.search),
      label: Text('Search'),
      onPressed: () async {
        final result = await showSearch(
          context: context,
          delegate: CustomSearchDelegate(),
        );
        
        print(result);
      },
    );
  }
}

class CustomSearchDelegate<String> extends SearchDelegate<String> {
  final dataMap = {
    "India": [
      "Mumbai",
      "Delhi",
    ],
    "Australia": [
      "Sydney",
      "Perth",
      "Queensland",
    ],
    "USA": [
      "LA",
      "New York",
    ]
  };

  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      if (query.isNotEmpty)
        IconButton(
          icon: Icon(Icons.clear),
          onPressed: () {
            query = '';
          },
        ),
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return BackButton(
      onPressed: () {
        close(context, null);
      },
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return buildSuggestions(context);
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    List<String> list = [];

    if (query.isNotEmpty) {
      dataMap.forEach((country, cities) {
        cities.forEach((city) {
          if (city.toLowerCase().startsWith(query.toLowerCase())) {
            list.add('$city, $country');
          }
        });
      });
    }

    return ListView(
      children: ListTile.divideTiles(
        context: context,
        tiles: list.map((data) {
          return ListTile(
            title: Text(data),
            onTap: () {
              close(context, data);
            },
          );
        }),
      ).toList(),
    );
  }
}