在 dart 中查询 Map<String, List<String>> 的元素以进行搜索委托
Query elements of a Map<String, List<String>> in dart for search delegate
我在 Dart 上有一个具有以下结构的复杂地图
{
"India":["Mumbai","Delhi"],
"Australia":["Sydney","Perth" ,"Queensland" ],
"USA":["LA","New York"]
}
我正在使用 flutter 中的搜索委托实现搜索。但无法使用编辑文本查询数据。
在上面的示例中,我试图通过国内城市进行搜索。我怎样才能做到这一点?
例如,如果用户输入“M”,那么带有 M 字母的城市应该与国家名称一起显示
非常感谢。
您只需要遍历 Map
,然后像这样遍历 List
的值:
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(),
);
}
}
我在 Dart 上有一个具有以下结构的复杂地图
{
"India":["Mumbai","Delhi"],
"Australia":["Sydney","Perth" ,"Queensland" ],
"USA":["LA","New York"]
}
我正在使用 flutter 中的搜索委托实现搜索。但无法使用编辑文本查询数据。
在上面的示例中,我试图通过国内城市进行搜索。我怎样才能做到这一点? 例如,如果用户输入“M”,那么带有 M 字母的城市应该与国家名称一起显示
非常感谢。
您只需要遍历 Map
,然后像这样遍历 List
的值:
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(),
);
}
}