Flutter搜索功能插件mysearch的使用

Flutter搜索功能插件mysearch的使用

mysearch 是一个用于在 Flutter 应用中实现搜索功能的插件。它允许用户通过输入关键词来快速查找数据,并以列表的形式展示搜索结果。

获取开始

这个项目是一个起点,用于创建一个 Flutter 插件包,该插件包包含 Android 和/或 iOS 的平台特定实现代码。

如果你需要帮助开始使用 Flutter,可以查看 Flutter 官方文档,其中提供了教程、示例、移动开发指南以及完整的 API 参考。

使用示例

以下是一个完整的示例代码,展示了如何在 Flutter 中使用 mysearch 插件实现搜索功能。

示例代码

// example/lib/main.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mysearch/mysearch.dart';
import 'package:mysearch/model.dart';

void main() => runApp(const MyMaterialApp());

class MyMaterialApp extends StatelessWidget {
  const MyMaterialApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'MySearch App',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('MySearch App'),
        actions: [
          // 导航到搜索页面
          IconButton(
              onPressed: () =>
                  Navigator.of(context).push(MaterialPageRoute(builder: (_) => const Searchpage())),
              icon: const Icon(Icons.search))
        ],
      ),
    );
  }
}

class Searchpage extends StatefulWidget {
  const Searchpage({Key? key}) : super(key: key);

  [@override](/user/override)
  _SearchpageState createState() => _SearchpageState();
}

class _SearchpageState extends State<Searchpage> {
  Future<List<SearchResultItem>>? _futureSearchResultItem;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        toolbarHeight: 0,
      ),
      body: Container(
        color: Colors.white,
        child: Column(
          children: <Widget>[
            Container(
              decoration: const BoxDecoration(boxShadow: <BoxShadow>[
                BoxShadow(
                    color: Colors.black12,
                    blurRadius: 2.0,
                    offset: Offset(0.0, 0.75))
              ], color: Colors.white),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Expanded(
                      flex: 10,
                      child: Center(
                        child: Padding(
                          padding: const EdgeInsets.fromLTRB(0, 4, 0, 4),
                          child: MySearchField(
                            searchIndex: 0,
                            searchSize: 50,
                            source: "www.mygov.bd",
                            textFieldConfiguration: TextFieldConfiguration(
                              autofocus: true,
                              style: DefaultTextStyle.of(context)
                                  .style
                                  .copyWith(
                                    fontSize: 14,
                                    fontStyle: FontStyle.normal,
                                    color: const Color.fromRGBO(15, 17, 23, 1),
                                    fontWeight: FontWeight.w500,
                                  ),
                              decoration: const InputDecoration(
                                border: InputBorder.none,
                              ),
                            ),
                            onSearchResultFound: (List<SearchResultItem> searchResult) {
                              _futureSearchResultItem =
                                  Future<List<SearchResultItem>>.value(searchResult);
                              setState(() {});
                            },
                          ),
                        ),
                      )),
                ],
              ),
            ),
            const SizedBox(
              height: 10.0,
            ),
            (_futureSearchResultItem == null)
                ? const Padding(
                    padding: EdgeInsets.all(8.0),
                    child: Text("Search Anything"),
                  )
                : Flexible(
                    child: Container(
                      child: buildFutureBuilder(),
                    ),
                  )
          ],
        ),
      ),
    );
  }

  FutureBuilder<List<SearchResultItem>> buildFutureBuilder() {
    return FutureBuilder<List<SearchResultItem>>(
      future: _futureSearchResultItem,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return ListView.builder(
            scrollDirection: Axis.vertical,
            shrinkWrap: true,
            itemCount: snapshot.data!.length,
            itemBuilder: (context, index) {
              SearchResultItem searchItem = snapshot.data![index];
              return Container(
                padding: const EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 12.0),
                color: Colors.white,
                child: Column(children: <Widget>[
                  Row(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Container(
                        alignment: Alignment.center,
                        child: const Padding(
                          padding: EdgeInsets.fromLTRB(12, 4, 8, 0),
                          child: Icon(
                            Icons.receipt_rounded,
                            size: 16,
                            color: Color.fromRGBO(15, 17, 23, 0.4),
                          ),
                        ),
                      ),
                      Flexible(
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          mainAxisAlignment: MainAxisAlignment.start,
                          children: [
                            const SizedBox(
                              height: 4.0,
                            ),
                            Align(
                              alignment: Alignment.centerLeft,
                              child: Text(
                                searchItem.name,
                                style: const TextStyle(
                                    fontWeight: FontWeight.bold,
                                    color: Colors.grey),
                              ),
                            ),
                            const SizedBox(
                              height: 4.0,
                            ),
                            Align(
                              alignment: Alignment.centerLeft,
                              child: Text(
                                searchItem.service_id,
                                style: const TextStyle(
                                    fontWeight: FontWeight.normal,
                                    color: Colors.grey,
                                    fontSize: 12),
                                textAlign: TextAlign.left,
                              ),
                            ),
                            const SizedBox(
                              height: 4.0,
                            ),
                            Align(
                              alignment: Alignment.centerLeft,
                              child: Text(
                                "Department : ${searchItem.department}",
                                style: const TextStyle(
                                    fontWeight: FontWeight.normal,
                                    color: Colors.grey),
                              ),
                            ),
                            Align(
                              alignment: Alignment.centerLeft,
                              child: Text(
                                "Office : ${searchItem.office}",
                                style: const TextStyle(
                                    fontWeight: FontWeight.normal,
                                    color: Colors.grey),
                              ),
                            ),
                            Align(
                              alignment: Alignment.centerLeft,
                              child: Text(
                                "Service Sector : ${searchItem.service_sector}",
                                style: const TextStyle(
                                    fontWeight: FontWeight.normal,
                                    color: Colors.grey),
                              ),
                            ),
                            Align(
                              alignment: Alignment.centerLeft,
                              child: Text(
                                "Source : ${searchItem.source}",
                                style: const TextStyle(
                                    fontWeight: FontWeight.normal,
                                    color: Colors.grey),
                              ),
                            ),
                          ],
                        ),
                      )
                    ],
                  )
                ]),
              );
            },
          );
        } else if (snapshot.hasError) {
          return Text('${snapshot.error}');
        }

        return const CircularProgressIndicator();
      },
    );
  }
}

更多关于Flutter搜索功能插件mysearch的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter搜索功能插件mysearch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mysearch 是一个用于 Flutter 的搜索功能插件,它可以帮助你在应用中轻松实现搜索功能。以下是使用 mysearch 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 mysearch 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  mysearch: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 mysearch 包:

import 'package:mysearch/mysearch.dart';

3. 使用 MySearch 组件

你可以使用 MySearch 组件来创建一个搜索框,并将其集成到你的应用中。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:mysearch/mysearch.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SearchPage(),
    );
  }
}

class SearchPage extends StatefulWidget {
  @override
  _SearchPageState createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> {
  List<String> _items = [
    'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry', 'Fig', 'Grape', 'Honeydew'
  ];
  List<String> _filteredItems = [];

  @override
  void initState() {
    super.initState();
    _filteredItems = _items;
  }

  void _onSearch(String query) {
    setState(() {
      _filteredItems = _items
          .where((item) => item.toLowerCase().contains(query.toLowerCase()))
          .toList();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Search Example'),
      ),
      body: Column(
        children: [
          MySearch(
            onSearch: _onSearch,
            hintText: 'Search...',
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _filteredItems.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_filteredItems[index]),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

4. 解释代码

  • MySearch 组件:这是一个搜索框组件,用户可以在这里输入搜索关键词。onSearch 回调会在用户输入时触发,传递当前的搜索关键词。
  • _onSearch 方法:这个方法根据用户输入的关键词过滤列表数据,并更新 _filteredItems
  • ListView.builder:用于显示过滤后的列表数据。

5. 自定义样式

你可以通过 MySearch 组件的参数来自定义搜索框的样式,例如 hintTextdecoration 等。

MySearch(
  onSearch: _onSearch,
  hintText: 'Search...',
  decoration: InputDecoration(
    border: OutlineInputBorder(),
    prefixIcon: Icon(Icons.search),
  ),
)
回到顶部