precision_select_dropdown 0.0.1
precision_select_dropdown: ^0.0.1 copied to clipboard
A production-ready, generic, searchable dropdown widget for Flutter with overlay positioning, debounced search, and full customization support.
import 'package:flutter/material.dart';
import 'package:precision_select_dropdown/precision_select_dropdown.dart';
class User {
final String id;
final String name;
final String email;
User({required this.id, required this.name, required this.email});
}
class Person {
final String name;
final String email;
Person({required this.name, required this.email});
}
class Country {
final String name;
final String code;
Country(this.name, this.code);
}
void main() {
runApp(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 Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: 'Precision Select Dropdown Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Padding(
padding: const EdgeInsets.all(18.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
_usersDropdown(),
SizedBox(height: 30),
_personsDropdown(),
SizedBox(height: 30),
_countryDropdown(),
],
),
),
);
}
Widget _usersDropdown() {
List<User> users = [
User(id: '1', name: 'Alice', email: 'alice@gmail.com'),
User(id: '2', name: 'Dice', email: 'Dice@gmail.com'),
User(id: '3', name: 'Nice', email: 'nice@gmail.com'),
];
return PrecisionSelectDropdown<User>(
items: users,
hintText: "Select User",
itemLabelBuilder: (user) => user.name,
searchMatcher: (user, query) =>
user.name.toLowerCase().contains(query.toLowerCase()) ||
user.email.toLowerCase().contains(query.toLowerCase()),
itemBuilder: (context, user) =>
ListTile(title: Text(user.name), subtitle: Text(user.email)),
onChanged: (selectedUser) {
debugPrint(selectedUser?.name);
},
);
}
Widget _personsDropdown() {
List<Person> persons = [
Person(name: 'SS', email: 'SS@gmail.com'),
Person(name: 'SA', email: 'SA@gmail.com'),
Person(name: 'MS', email: 'MS@gmail.com'),
];
return PrecisionSelectDropdown<Person>(
items: persons,
hintText: "Select Person",
itemLabelBuilder: (user) => user.name,
searchMatcher: (user, query) =>
user.name.toLowerCase().contains(query.toLowerCase()) ||
user.email.toLowerCase().contains(query.toLowerCase()),
itemBuilder: (context, user) =>
ListTile(title: Text(user.name), subtitle: Text(user.email)),
onChanged: (selectedUser) {
debugPrint(selectedUser?.name);
},
);
}
Widget _countryDropdown() {
List<Country> countries = [Country('India', 'IN'), Country('USA', 'US')];
return PrecisionSelectDropdown<Country>(
items: countries,
hintText: "Select Country",
itemLabelBuilder: (country) => country.name,
itemBuilder: (context, country) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [Text("${country.code} - "), Text(country.name)],
),
);
},
onChanged: (country) {},
);
}
}