Flutter 实现搜索功能

发布于 2022-05-30 18:15:23 字数 5395 浏览 1197 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦里泪两行

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

遂心如意

文章 0 评论 0

5513090242

文章 0 评论 0

巷雨优美回忆

文章 0 评论 0

junpengz2000

文章 0 评论 0

13郎

文章 0 评论 0

qq_xU4RDg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文