Reputation: 140
How can I search item from Searchable Dropdown per Name instead of per Id ?
SearchableDropdown(items:_vagasDisponiveis.map((item) {
return new DropdownMenuItem(
child: Text(item.v_n),
value: item.v_id
);
}
).toList(),
isExpanded: true,
value: vaga_id,
isCaseSensitiveSearch: true,
searchHint: new Text('Select ', style: new TextStyle(fontSize: 20)),
onChanged: (value) {
setState(() {
vaga_id = value;
});
},
)
Example: https://pub.dev/packages/searchable_dropdown
Upvotes: 7
Views: 13853
Reputation: 361
i am using dropdown_search: ^0.4.8
here is my code which finds item with there name and in value it sets their id.
import 'package:dropdown_search/dropdown_search.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
KeyValueModel selectedValue;
String hello;
TextEditingController v = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
DropdownSearch<KeyValueModel>(
mode: Mode.DIALOG,
showSelectedItem:false,
items: [KeyValueModel(itemId: "123",itemName: "mohit"),KeyValueModel(itemId: "124",itemName: "hello"),KeyValueModel(itemId: "125",itemName: "hey")],
itemAsString: (KeyValueModel u) => u.itemName,
hint: "select",
onChanged: (value){
v.text = value.itemId.toString();
print(value.itemId);
},
showSearchBox: true,
filterFn: (instance, filter){
if(instance.itemName.contains(filter)){
print(filter);
return true;
}
else{
return false;
}
},
popupItemBuilder: (context,KeyValueModel item,bool isSelected){
return Container(
margin: EdgeInsets.symmetric(horizontal: 8),
decoration: !isSelected
? null
: BoxDecoration(
border: Border.all(color: Theme.of(context).primaryColor),
borderRadius: BorderRadius.circular(5),
color: Colors.white,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(item.itemName),
),
);
},
),
],
),
),
),
);
}
}
class KeyValueModel{
String itemName;
String itemId;
KeyValueModel({this.itemName,this.itemId});
}
Upvotes: 1
Reputation: 54367
You have to overwrite your class's toString()
so it can search both id and name
because SearchableDropdown
's source code use item.value.toString()
when you pass class name it will become I/flutter ( 7352): Instance of 'VagasDisponivei'
you can copy paste run full code below
code snippet
class VagasDisponivei {
String v_n;
String v_id;
VagasDisponivei({this.v_n, this.v_id});
@override
String toString() {
return '${v_n} ${v_id}';
}
}
SearchableDropdown(
items: _vagasDisponiveis.map((item) {
return new DropdownMenuItem<VagasDisponivei>(
child: Text(item.v_n), value: item);
}).toList(),
isExpanded: true,
value: selectedValue,
isCaseSensitiveSearch: true,
searchHint: new Text(
'Select ',
style: new TextStyle(fontSize: 20),
),
onChanged: (value) {
setState(() {
selectedValue = value;
print(selectedValue);
});
},
),
working demo
full code
import 'package:flutter/material.dart';
import 'package:searchable_dropdown/searchable_dropdown.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class VagasDisponivei {
String v_n;
String v_id;
VagasDisponivei({this.v_n, this.v_id});
@override
String toString() {
return '${v_n} ${v_id}';
}
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
List<VagasDisponivei> _vagasDisponiveis;
String vaga_name;
VagasDisponivei selectedValue;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
_vagasDisponiveis = [
VagasDisponivei(v_id: "1", v_n: "abc"),
VagasDisponivei(v_id: "2", v_n: "def"),
VagasDisponivei(v_id: "3", v_n: "dgg"),
];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SearchableDropdown(
items: _vagasDisponiveis.map((item) {
return new DropdownMenuItem<VagasDisponivei>(
child: Text(item.v_n), value: item);
}).toList(),
isExpanded: true,
value: selectedValue,
isCaseSensitiveSearch: true,
searchHint: new Text(
'Select ',
style: new TextStyle(fontSize: 20),
),
onChanged: (value) {
setState(() {
selectedValue = value;
print(selectedValue);
});
},
),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
code snippet of SearchableDropdown
if(widget.isCaseSensitiveSearch){
print(item.value.toString());
isContains = item.value.toString().contains(keyword);
}
Upvotes: 12