mk_smart_search 1.0.0 copy "mk_smart_search: ^1.0.0" to clipboard
mk_smart_search: ^1.0.0 copied to clipboard

High-performance bilingual (English/Arabic) fuzzy search engine for Flutter. Features intelligent typo tolerance, semantic matching, field weighting, and automatic isolate optimization for large datas [...]

example/lib/main.dart

import 'dart:async';

import 'package:example/test_data/test_list.dart';
import 'package:flutter/material.dart';
import 'package:mk_smart_search/search_extensions.dart';
import 'model/product.dart';

void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Smart Search Engine',
      theme: ThemeData(useMaterial3: true),
      home: const SmartSearchPage(),
    );
  }
}

class SmartSearchPage extends StatefulWidget {
  const SmartSearchPage({super.key});

  @override
  State<SmartSearchPage> createState() => _SmartSearchPageState();
}

class _SmartSearchPageState extends State<SmartSearchPage> {
  final TextEditingController _controller = TextEditingController();
  final products = TestList().generateMaxProducts(maxRecords: 1000);

  List<Product> results = [];
  bool isLoading = false;

  Timer? _debounce;

  @override
  void dispose() {
    _debounce?.cancel();
    _controller.dispose();
    super.dispose();
  }

  void _onSearchChanged(String query) {
    if (_debounce?.isActive ?? false) _debounce!.cancel();

    _debounce = Timer(const Duration(milliseconds: 300), () async {
      if (query.trim().isEmpty) {
        setState(() => results = []);
        return;
      }

      setState(() => isLoading = true);
      final searchResults = await products.smartSearchExtension(
        query: query,
        searchFieldsMap: {
          'name': ['nameAr', 'nameEn'],
          'category': ['category'],
        },
        toJson: (p) => p.toJson(),
        fieldWeights: {
          'name': 3,
          'category': 0.5,
        },
        minScore: 0.4,
        limit: 10,
        useIsolate: true,
      );

      setState(() {
        results = searchResults;
        isLoading = false;
      });

    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Smart Search'),
      ),
      body: Column(
        children: [
          /// 🔍 Search Box
          Padding(
            padding: const EdgeInsets.all(12),
            child: TextField(
              controller: _controller,
              onChanged: _onSearchChanged,
              decoration: InputDecoration(
                hintText: 'Search products...',
                prefixIcon: const Icon(Icons.search),
                suffixIcon: _controller.text.isNotEmpty
                    ? IconButton(
                  icon: const Icon(Icons.clear),
                  onPressed: () {
                    _controller.clear();
                    setState(() => results = []);
                  },
                )
                    : null,
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(12),
                ),
              ),
            ),
          ),

          /// ⏳ Loading
          if (isLoading)
            const Padding(
              padding: EdgeInsets.all(16),
              child: CircularProgressIndicator(),
            ),

          /// 📋 Results
          Expanded(
            child: results.isEmpty && _controller.text.isNotEmpty && !isLoading
                ? const Center(
              child: Text(
                'No results found',
                style: TextStyle(fontSize: 16),
              ),
            )
                : ListView.separated(
              itemCount: results.length,
              separatorBuilder: (_, __) =>
              const Divider(height: 1),
              itemBuilder: (context, index) {
                final product = results[index];

                return ListTile(
                  leading: const Icon(Icons.shopping_bag),
                  title: Text(product.nameEn),
                  subtitle: Text(product.nameAr),
                  trailing: Text(
                    '${product.price.toStringAsFixed(2)} SAR',
                    style: const TextStyle(fontWeight: FontWeight.bold),
                  ),
                  onTap: () {
                    debugPrint(
                        'Selected: ${product.nameEn} (${product.id})');
                  },
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}
7
likes
140
points
151
downloads

Publisher

unverified uploader

Weekly Downloads

High-performance bilingual (English/Arabic) fuzzy search engine for Flutter. Features intelligent typo tolerance, semantic matching, field weighting, and automatic isolate optimization for large datasets. Perfect for e-commerce, product search, and multilingual apps.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on mk_smart_search