Flutter 实现搜索功能
App 中的搜索功能非常常见,Flutter 提供了内置的搜索功能,如最常见的把搜索功能放置在 appbar 的右边:
import 'package:flutter/material.dart'; void main() => runApp(MaterialApp( home: MyApp(), )); class MyApp extends StatelessWidget { const MyApp({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( actions: <Widget>[ IconButton( icon: Icon(Icons.search), onPressed: () { }, ) ], ), ); } }
使用内置的搜索功能需要实现自己的 Delegate,简单回顾一下,常见的搜索功能:常见的搜索输入文字过程中有相应的提示,输入完成后显示对应的搜索结果,实现一个简单的如下:
class SearchBarView extends SearchDelegate<String> { String searchHint = '请输入内容'; @override List<Widget> buildActions(BuildContext context) { // TODO: implement buildActions return [Text('hello')]; } @override Widget buildLeading(BuildContext context) { // TODO: implement buildLeading return Icon(Icons.book); } @override Widget buildResults(BuildContext context) { // TODO: implement buildResults return Text('world'); } @override Widget buildSuggestions(BuildContext context) { // TODO: implement buildSuggestions return Text('ooo'); } }
实现的方法主要有:
- buildActions 显示在最右边的图标列表。
- buildLeading 搜索栏左边的图标,一般都是返回。
- buildResults 这个回调里进行搜索和并返回自己的搜索结果。
- buildSuggestions 返回建议搜索结果。
void main() => runApp(MaterialApp( home: MyApp(), )); class MyApp extends StatelessWidget { const MyApp({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( actions: <Widget>[ IconButton( icon: Icon(Icons.search), onPressed: () { showSearch(context: context, delegate: SearchBarView()); }, ) ], ), ); } }
实现一个简单搜索 qq 音乐的例子,如下:
import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; import 'dart:convert'; class hotSearch extends StatefulWidget { hotSearch({Key key}) : super(key: key); _hotSearchState createState() => _hotSearchState(); } class _hotSearchState extends State<hotSearch> { List data = []; getData() async { Dio dio = new Dio(); Response res = await dio.get( 'https://c.y.qq.com/splcloud/fcgi-bin/gethotkey.fcg?g_tk=5381&uin=0¬ice=0&platform=h5&needNewCode=1&_=1513317614040'); var hotkey = json.decode(res.data)['data']['hotkey']; setState(() { data = hotkey; }); } @override void initState() { // TODO: implement initState super.initState(); this.getData(); } @override Widget build(BuildContext context) { return Container( child: ListView.builder( itemBuilder: (BuildContext context, int index) { return Text(data[index]['k']); }, itemCount: data.length, )); } } class searchResult extends StatefulWidget { String keyword; searchResult({Key key, this.keyword}) : super(key: key); _searchResultState createState() => _searchResultState(); } class _searchResultState extends State<searchResult> { List data = []; getData() async { Dio dio = new Dio(); print(widget.keyword); String word = widget.keyword; Response res = await dio.get( 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?g_tk=5381&p=1&n=20&w=$word&format=json'); print('key'); List songs = json.decode(res.data)['data']['song']['list']; setState(() { data = songs; }); } @override void initState() { // TODO: implement initState super.initState(); this.getData(); } @override Widget build(BuildContext context) { return Container( child: ListView.builder( itemCount: data.length, itemBuilder: (BuildContext context, int index) { return Text(data[index]['songname']); }, )); } } class SearchBarView extends SearchDelegate<String> { String searchHint = '请输入内容'; @override List<Widget> buildActions(BuildContext context) { // TODO: implement buildActions return [Text('hello')]; } @override Widget buildLeading(BuildContext context) { // TODO: implement buildLeading return Icon(Icons.book); } @override Widget buildResults(BuildContext context) { // TODO: implement buildResults return searchResult( keyword: query, ); } @override Widget buildSuggestions(BuildContext context) { // TODO: implement buildSuggestions return hotSearch(); } } void main() => runApp(MaterialApp( home: MyApp(), )); class MyApp extends StatelessWidget { const MyApp({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( actions: <Widget>[ IconButton( icon: Icon(Icons.search), onPressed: () { showSearch(context: context, delegate: SearchBarView()); }, ) ], ), ); } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: TypeScript 实践中常见的问题
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论