sqlite3_arabic_tokenizer_flutter 0.0.2
sqlite3_arabic_tokenizer_flutter: ^0.0.2 copied to clipboard
SQLite3 Arabic Tokenizer
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:provider/provider.dart';
import 'package:sqlite3_arabic_tokenizer_flutter_example/provider/app_provider.dart';
void main() {
runApp(MultiProvider(providers: [
ChangeNotifierProvider<AppProvider>(
create: (_) => AppProvider(),
lazy: false,
),
], child: const MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Tokenizer Demo',
theme: ThemeData(
primarySwatch: Colors.amber,
),
home: const MyHomePage(title: 'Flutter Tokenizer Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late TextEditingController _textEditingController;
Timer? _debounce;
@override
void initState() {
_textEditingController = TextEditingController();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(
20,
),
child: TextField(
controller: _textEditingController,
decoration: InputDecoration(
hintText: "Search arabic with or without diacritics",
hintStyle: TextStyle(
color: Colors.black,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1, color: Colors.amber),
borderRadius: BorderRadius.circular(0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1, color: Colors.black),
borderRadius: BorderRadius.circular(0),
),
errorBorder: OutlineInputBorder(
borderSide: const BorderSide(width: 1, color: Colors.red),
borderRadius: BorderRadius.circular(0),
),
),
onChanged: _onChanged,
onSubmitted: (v) {
Provider.of<AppProvider>(context, listen: false)
.search(v.trim());
},
),
),
Expanded(
child: ListView.builder(
padding: EdgeInsets.all(20),
itemCount: Provider.of<AppProvider>(context).verses.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
Provider.of<AppProvider>(context)
.verses[index]
.toString(),
),
);
},
),
),
],
),
),
);
}
void _onChanged(String query) {
if (_debounce?.isActive ?? false) {
_debounce?.cancel();
}
_debounce = Timer(const Duration(milliseconds: 500), () {
Provider.of<AppProvider>(context, listen: false).search(query.trim());
});
}
@override
void dispose() {
super.dispose();
_debounce?.cancel();
_textEditingController.dispose();
}
}