Advertisement
ceshen_pastebin

Autocomplete Text Field

Jun 30th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 5.50 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2. import 'package:autocomplete_textfield/autocomplete_textfield.dart';
  3.  
  4. import '../extensions/string_extension.dart';
  5. import '../presentation/custom_icons.dart';
  6.  
  7. import '../model/substancia_autocomplete_option.dart';
  8.  
  9. class AutocompleteInput extends StatefulWidget {
  10.   final List<SubstanciaAutocompleteOption> options; //int subsId, String descricao, StringprincipioAtivo, int comercialId (opitional)
  11.   final Function submitHandler; //setState() => _mySubstancesList.add(sub)
  12.   final int nextSub; // Integer that represents number of substances in _mySubstancesList + 1
  13.  
  14.   AutocompleteInput({
  15.    this.options,
  16.    this.submitHandler,
  17.    this.nextSub,
  18.   });
  19.  
  20.   @override
  21.   _AutocompleteInputState createState() => _AutocompleteInputState();
  22. }
  23.  
  24. class _AutocompleteInputState extends State<AutocompleteInput> {
  25.   SubstanciaAutocompleteOption _selectedOption;
  26.  
  27.   TextEditingController _controller = TextEditingController();
  28.   bool _hasError = false;
  29.   String errorMessage;
  30.  
  31.   GlobalKey<AutoCompleteTextFieldState<SubstanciaAutocompleteOption>> _key = new GlobalKey();
  32.  
  33.   Widget custonListTile(SubstanciaAutocompleteOption option) {
  34.     return Card(
  35.       elevation: 5,
  36.       margin: EdgeInsets.only(
  37.         top: 6,
  38.       ),
  39.       child: Container(
  40.         padding: EdgeInsets.only(left: 33, top: 5, bottom: 5, right: 5),
  41.         height: 45,
  42.         child: Column(
  43.           crossAxisAlignment: CrossAxisAlignment.start,
  44.           mainAxisAlignment: MainAxisAlignment.center,
  45.           children: <Widget>[
  46.             Text(
  47.               option.descricao.capitalize(),
  48.               style: TextStyle(
  49.                 fontSize: 16,
  50.               ),
  51.             ),
  52.             if(option.descricao != option.principioAtivo)
  53.               Text(
  54.                 option.descricao.capitalize(),
  55.                 style: TextStyle(
  56.                   fontSize: 14,
  57.                   color: Colors.black45
  58.                 ),
  59.               )
  60.           ],
  61.         ),
  62.       ),
  63.     );
  64.   }
  65.  
  66.   @override
  67.   Widget build(BuildContext context) {
  68.    
  69.     print('nextSub: ${widget.nextSub}');
  70.     return LayoutBuilder(
  71.       builder: (ctx, constraints){
  72.         return Row(
  73.           mainAxisSize: MainAxisSize.max,
  74.           crossAxisAlignment: CrossAxisAlignment.start,
  75.           children: <Widget>[
  76.             Expanded(
  77.               child: AutoCompleteTextField<SubstanciaAutocompleteOption> (
  78.                 key: _key,
  79.                 controller: _controller,
  80.                 itemSubmitted: (item) {
  81.                   setState(() {
  82.                     _controller.text = item.descricao;
  83.                     _selectedOption = new SubstanciaAutocompleteOption(
  84.                       subsId: item.subsId,
  85.                       principioAtivo: item.principioAtivo,
  86.                       comercialId: item.comercialId,
  87.                       descricao: item.descricao
  88.                     );
  89.                   });
  90.                 },
  91.                 clearOnSubmit: false,
  92.                 suggestions: widget.options,
  93.                 itemBuilder: (context, item) {
  94.                   SubstanciaAutocompleteOption opAux = new SubstanciaAutocompleteOption(
  95.                     subsId: item.subsId,
  96.                     principioAtivo: item.principioAtivo,
  97.                     descricao: item.descricao,
  98.                     comercialId: item.comercialId
  99.                     );
  100.                   return custonListTile(opAux);
  101.                 },
  102.                 itemSorter: (a, b) {
  103.                   return a.descricao.compareTo(b.descricao);
  104.                 },
  105.                 itemFilter: (item, query) {
  106.                   return item.descricao.toLowerCase().startsWith(query.toLowerCase());
  107.                 },
  108.                 decoration: InputDecoration(
  109.                   contentPadding: EdgeInsets.only(top: 10.0),
  110.                   border: OutlineInputBorder(
  111.                     borderSide: BorderSide(
  112.                       color: Theme.of(context).primaryColor
  113.                     )
  114.                   ),
  115.                   hintText: 'Informe o ${widget.nextSub}º produto',
  116.                   labelText: 'Adicionar Produto à Mistura',
  117.                   errorText: _hasError ? errorMessage : null,
  118.                   prefixIcon: Icon(Custom.beaker),
  119.                 ),
  120.                 style: TextStyle(
  121.                   fontSize: 18,
  122.                 ),
  123.               ),
  124.             ),
  125.             Container(
  126.               margin: EdgeInsets.only(left: 5),
  127.               decoration: BoxDecoration(
  128.                 borderRadius: BorderRadius.circular(6),
  129.                 boxShadow: [
  130.                   BoxShadow(color: Colors.green, spreadRadius: 1),
  131.                 ],
  132.               ),
  133.               child: IconButton(
  134.                 color: Colors.white,
  135.                 icon: Icon(Icons.add),
  136.                 onPressed: () {
  137.                   if(_selectedOption != null) {
  138.                     _controller.clear();
  139.                     if(!widget.submitHandler(_selectedOption)) {
  140.                       print('entrou aqui');
  141.                       setState(() {
  142.                         errorMessage = "Este produto já foi selecionado!";
  143.                         _hasError = true;
  144.                       });
  145.                     }
  146.                     _selectedOption = null;
  147.                   }
  148.                   else {
  149.                     // TO DO
  150.                   }
  151.                 }  
  152.               ),
  153.             ),
  154.           ],
  155.         );
  156.       }
  157.     );
  158.   }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement