FindDropdown package - [view english]
Simples e robusto FindDropdown com recurso de busca entre os itens, possibilitando utilizar uma lista de itens offline ou uma URL para filtragem, com fácil customização.
Se você utiliza o rxdart em seu projeto em uma versão inferior a 0.23.x, utilize a versão 0.1.7+1
desse package.
Caso contrário, pode utilizar a versão mais atual!
find_dropdown: <lastest version>
import 'package:find_dropdown/find_dropdown.dart';
FindDropdown(
items: ["Brasil", "Itália", "Estados Unidos", "Canadá"],
label: "País",
onChanged: (String item) => print(item),
selectedItem: "Brasil",
);
FindDropdown<String>.multiSelect(
items: ["Brasil", "Itália", "Estados Unidos", "Canadá"],
label: "País",
onChanged: (List<String> items) => print(items),
selectedItems: ["Brasil"],
);
FindDropdown(
items: ["Brasil", "Itália", "Estados Unidos", "Canadá"],
label: "País",
onChanged: (String item) => print(item),
selectedItem: "Brasil",
validate: (String item) {
if (item == null)
return "Campo obrigatório";
else if (item == "Brasil")
return "Item inválido";
else
return null; //retorno null para "sem erro"
},
);
Implementação com endpoint (utilizando o package Dio)
FindDropdown<UserModel>(
label: "Nome",
onFind: (String filter) async {
var response = await Dio().get(
"http://5d85ccfb1e61af001471bf60.mockapi.io/user",
queryParameters: {"filter": filter},
);
var models = UserModel.fromJsonList(response.data);
return models;
},
onChanged: (UserModel data) {
print(data);
},
);
var countriesKey = GlobalKey<FindDropdownState>();
Column(
children: [
FindDropdown<String>(
key: countriesKey,
items: ["Brasil", "Itália", "Estados Unidos", "Canadá"],
label: "País",
selectedItem: "Brasil",
showSearchBox: false,
onChanged: (selectedItem) => print("country: $selectedItem"),
),
RaisedButton(
child: Text('Limpar Países'),
color: Theme.of(context).primaryColor,
textColor: Theme.of(context).primaryIconTheme.color,
onPressed: () => countriesKey.currentState?.clear(),
),
],
)
var countriesKey = GlobalKey<FindDropdownState>();
Column(
children: [
FindDropdown<UserModel>(
label: "Nome",
onFind: (String filter) => getData(filter),
searchBoxDecoration: InputDecoration(
hintText: "Search",
border: OutlineInputBorder(),
),
onChanged: (UserModel data) {
print(data);
countriesKey.currentState.setSelectedItem(null);
},
),
FindDropdown<String>(
key: countriesKey,
items: ["Brasil", "Itália", "Estados Unidos", "Canadá"],
label: "País",
selectedItem: "Brasil",
showSearchBox: false,
onChanged: (selectedItem) => print("country: $selectedItem"),
),
],
)
É possível customizar o layout do FindDropdown e de seus itens. EXEMPLO
Para customizar o FindDropdown, temos a propriedade dropdownBuilder
, que recebe uma função com os parâmetros:
BuildContext context
: Contexto do item atual;T item
: Item atual, onde T é o tipo passado no construtor do FindDropdown.
Para customizar os itens, temos a propriedade dropdownItemBuilder
, que recebe uma função com os parâmetros:
BuildContext context
: Contexto do item atual;T item
: Item atual, onde T é o tipo passado no construtor do FindDropdown.bool isSelected
: Boolean que informa se o item atual está selecionado.
Para usar um modelo como item no dropdown, é necessário implementar os métodos toString, equals e hashcode, conforme mostrado abaixo:
class UserModel {
final String id;
final DateTime createdAt;
final String name;
final String avatar;
UserModel({this.id, this.createdAt, this.name, this.avatar});
@override
String toString() => name;
@override
operator ==(o) => o is UserModel && o.id == id;
@override
int get hashCode => id.hashCode^name.hashCode^createdAt.hashCode;
}