Flutter搜索功能插件choseong_search的使用

Flutter 搜索功能插件choseong_search的使用

韩文初音搜索 Flutter 插件。

example

安装

在终端中运行 flutter pub add choseong_search 或者手动将包添加到 pubspec.yaml 文件中:

dependencies:
  choseong_search: 1.0.0

然后在代码中导入该包:

import 'package:choseong_search/choseong_search.dart';

使用

1. 初音搜索

import 'package:choseong_search/choseong_search.dart';

ChoseongSearch.compare(query: "ㅇㄴㅎㅅㅇ", target: "안녕하세요") // 返回 true
ChoseongSearch.compare(query: "ㅇ녕하ㅅㅇ", target: "안녕하세요") // 返回 true
ChoseongSearch.compare(query: "ㅇ녕하ㅅ염", target: "안녕하세요") // 返回 false

比较查询字符串 query 和目标字符串 target 并返回一个布尔值。

2. 提取初音、中音和终音

import 'package:choseong_search/choseong_search.dart';

ChoseongSearch.getChoseong(char: "안녕하세요ㅋㅋ") // 返回 "ㅇㄴㅎㅅㅇㅋㅋ"
ChoseongSearch.getJungseong(char: "안녕하세요ㅋㅋ") // 返回 "ㅏㅕㅏㅔㅛ  "
ChoseongSearch.getJongseong(char: "안녕하세요ㅋㅋ") // 返回 "ㄴㅇ     "

输入字符 char 并提取其初音、中音和终音。未提取的目标音节位置会填充空格 " "。

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用程序中使用 choseong_search 插件进行韩文初音搜索。

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: '韩文初音搜索'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  final List<String> hangeulWords = [
    '가방',
    '가지',
    '가위',
    '가을',
    '나무늘보',
    '노트북',
    '눈사람',
    '넥타이',
    '가사',
    '가장',
    '바나나',
    '사과나무',
    '자동차',
    '주머니',
    '초콜릿',
  ];

  final TextEditingController searchBarController = TextEditingController();
  List<String> _filteredList = [];

  void _filterList(String query) {
    List<String> filteredList = [];

    if (query.isEmpty) {
      filteredList.addAll(hangeulWords);
    } else {
      for (final item in hangeulWords) {
        if (ChoseongSearch.compare(query: query, target: item)){
          filteredList.add(item);
        }
      }
    }

    setState(() {
      _filteredList = filteredList;
    });
  }

  [@override](/user/override)
  void initState() {
    _filterList("");
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: searchBarController,
              onChanged: (query) {
                setState(() {
                  _filterList(query);
                });
              },
              decoration: InputDecoration(
                hintText: '搜索',
                prefixIcon: const Icon(Icons.search),
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(8.0),
                  borderSide: BorderSide.none,
                ),
                filled: true,
                fillColor: Colors.grey[200],
                contentPadding: const EdgeInsets.symmetric(vertical: 0.0, horizontal: 20.0),
              ),
            ),
            const SizedBox(height: 40),
            Expanded(
              child: GridView.builder(
                gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2,
                  crossAxisSpacing: 0.0,
                  mainAxisSpacing: 0.0,
                  childAspectRatio: 3
                ),
                itemCount: _filteredList.length,
                itemBuilder: (context, index) {
                  final item = _filteredList[index];
                  return Center(
                    child: Text(
                      item,
                      style: const TextStyle(fontSize: 18),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


choseong_search 是一个用于在 Flutter 应用中实现韩文字母(초성, Choseong)搜索功能的插件。它可以帮助用户在输入韩文字母的初声时,快速过滤和搜索相关的韩文词汇。

安装

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

dependencies:
  choseong_search: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本用法

1. 导入包

import 'package:choseong_search/choseong_search.dart';

2. 准备数据

假设你有一个韩文词汇列表:

List<String> words = [
  "가방", "나비", "다리", "라면", "마음",
  "바다", "사랑", "아기", "자동차", "차차차"
];

3. 使用 ChoseongSearch 进行搜索

void main() {
  // 初始化 ChoseongSearch
  final choseongSearch = ChoseongSearch(words);

  // 搜索
  final results = choseongSearch.search("ㄱ"); // 搜索以 "ㄱ" 开头的词汇

  // 输出结果
  print(results); // ["가방"]
}

高级用法

1. 自定义搜索函数

你可以自定义搜索函数来实现更复杂的搜索逻辑。

final results = choseongSearch.search("ㄱ", (word, choseong) {
  // 自定义搜索逻辑
  return word.startsWith(choseong);
});

2. 支持模糊搜索

choseong_search 也支持模糊搜索,即可以匹配词汇中包含的初声。

final results = choseongSearch.search("ㄱ", fuzzy: true);

3. 搜索结果排序

你可以对搜索结果进行排序,比如按词汇长度排序。

final results = choseongSearch.search("ㄱ")..sort((a, b) => a.length.compareTo(b.length));

示例应用

以下是一个完整的示例应用,展示了如何在 Flutter 中使用 choseong_search

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

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

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

class SearchPage extends StatefulWidget {
  [@override](/user/override)
  _SearchPageState createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> {
  final List<String> words = [
    "가방", "나비", "다리", "라면", "마음",
    "바다", "사랑", "아기", "자동차", "차차차"
  ];

  final choseongSearch = ChoseongSearch([]);
  List<String> results = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    choseongSearch.setData(words);
  }

  void onSearch(String query) {
    setState(() {
      results = choseongSearch.search(query, fuzzy: true);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Choseong Search Demo'),
      ),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: TextField(
              onChanged: onSearch,
              decoration: InputDecoration(
                labelText: 'Search',
                hintText: 'Enter Choseong (e.g., ㄱ)',
              ),
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: results.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(results[index]),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}
回到顶部