Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'package:flutter/material.dart';
- import 'package:autocomplete_textfield/autocomplete_textfield.dart';
- import '../extensions/string_extension.dart';
- import '../presentation/custom_icons.dart';
- import '../model/substancia_autocomplete_option.dart';
- class AutocompleteInput extends StatefulWidget {
- final List<SubstanciaAutocompleteOption> options; //int subsId, String descricao, StringprincipioAtivo, int comercialId (opitional)
- final Function submitHandler; //setState() => _mySubstancesList.add(sub)
- final int nextSub; // Integer that represents number of substances in _mySubstancesList + 1
- AutocompleteInput({
- this.options,
- this.submitHandler,
- this.nextSub,
- });
- @override
- _AutocompleteInputState createState() => _AutocompleteInputState();
- }
- class _AutocompleteInputState extends State<AutocompleteInput> {
- SubstanciaAutocompleteOption _selectedOption;
- TextEditingController _controller = TextEditingController();
- bool _hasError = false;
- String errorMessage;
- GlobalKey<AutoCompleteTextFieldState<SubstanciaAutocompleteOption>> _key = new GlobalKey();
- Widget custonListTile(SubstanciaAutocompleteOption option) {
- return Card(
- elevation: 5,
- margin: EdgeInsets.only(
- top: 6,
- ),
- child: Container(
- padding: EdgeInsets.only(left: 33, top: 5, bottom: 5, right: 5),
- height: 45,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- Text(
- option.descricao.capitalize(),
- style: TextStyle(
- fontSize: 16,
- ),
- ),
- if(option.descricao != option.principioAtivo)
- Text(
- option.descricao.capitalize(),
- style: TextStyle(
- fontSize: 14,
- color: Colors.black45
- ),
- )
- ],
- ),
- ),
- );
- }
- @override
- Widget build(BuildContext context) {
- print('nextSub: ${widget.nextSub}');
- return LayoutBuilder(
- builder: (ctx, constraints){
- return Row(
- mainAxisSize: MainAxisSize.max,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: <Widget>[
- Expanded(
- child: AutoCompleteTextField<SubstanciaAutocompleteOption> (
- key: _key,
- controller: _controller,
- itemSubmitted: (item) {
- setState(() {
- _controller.text = item.descricao;
- _selectedOption = new SubstanciaAutocompleteOption(
- subsId: item.subsId,
- principioAtivo: item.principioAtivo,
- comercialId: item.comercialId,
- descricao: item.descricao
- );
- });
- },
- clearOnSubmit: false,
- suggestions: widget.options,
- itemBuilder: (context, item) {
- SubstanciaAutocompleteOption opAux = new SubstanciaAutocompleteOption(
- subsId: item.subsId,
- principioAtivo: item.principioAtivo,
- descricao: item.descricao,
- comercialId: item.comercialId
- );
- return custonListTile(opAux);
- },
- itemSorter: (a, b) {
- return a.descricao.compareTo(b.descricao);
- },
- itemFilter: (item, query) {
- return item.descricao.toLowerCase().startsWith(query.toLowerCase());
- },
- decoration: InputDecoration(
- contentPadding: EdgeInsets.only(top: 10.0),
- border: OutlineInputBorder(
- borderSide: BorderSide(
- color: Theme.of(context).primaryColor
- )
- ),
- hintText: 'Informe o ${widget.nextSub}º produto',
- labelText: 'Adicionar Produto à Mistura',
- errorText: _hasError ? errorMessage : null,
- prefixIcon: Icon(Custom.beaker),
- ),
- style: TextStyle(
- fontSize: 18,
- ),
- ),
- ),
- Container(
- margin: EdgeInsets.only(left: 5),
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(6),
- boxShadow: [
- BoxShadow(color: Colors.green, spreadRadius: 1),
- ],
- ),
- child: IconButton(
- color: Colors.white,
- icon: Icon(Icons.add),
- onPressed: () {
- if(_selectedOption != null) {
- _controller.clear();
- if(!widget.submitHandler(_selectedOption)) {
- print('entrou aqui');
- setState(() {
- errorMessage = "Este produto já foi selecionado!";
- _hasError = true;
- });
- }
- _selectedOption = null;
- }
- else {
- // TO DO
- }
- }
- ),
- ),
- ],
- );
- }
- );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement