Флаттер: автозаполнение текстового поля не работает с пользовательским типом данных - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь создать текстовое поле с функцией автозаполнения.И я использую Автозаполнение TextField пакет.

У меня есть класс модели Users с методами fromMap и toMap.Есть функция, которая извлекает пользователей из базы данных и возвращает список пользователей List<Users>.

Вот код, который создает поле автозаполнения:

AutoCompleteTextField searchTextField = AutoCompleteTextField<Users>(
    key: key,
    clearOnSubmit: false,
    suggestions: users,
    style: TextStyle(color: Colors.black, fontSize: 16.0),
    decoration: InputDecoration(
      contentPadding: EdgeInsets.fromLTRB(10.0, 30.0, 10.0, 20.0),
      hintText: "Search Name",
      hintStyle: TextStyle(color: Colors.black),
    ),
    itemFilter: (item, query) {
      return item.name.toLowerCase().startsWith(query.toLowerCase());
    },
    itemSorter: (a, b) {
      return a.name.compareTo(b.name);
    },
    itemSubmitted: (item) {
      setState(() {
        searchTextField.textField.controller.text = item.name;
      });
    },
    itemBuilder: (context, item) {
      return Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          Text(
            item.name,
          ),
        ],
      );
    },
  );

Q. Я что-то упускаю или делаю неправильно?

ПРИМЕЧАНИЕ:

  1. У объекта users есть список пользователей в правильном формате, я напечатал, чтобы проверить это.

1 Ответ

1 голос
/ 28 сентября 2019

Как уже упоминалось @pskink,

вы используете autocomplete_textfield ?у меня было много проблем с ним, которые исчезли, когда я переключился на flutter_typeahead (намного лучше задокументированный пакет)

Поэтому я рассмотрел его предложение и перешел на flutter_typeahead пакет,

final TextEditingController _typeAheadController = TextEditingController();

List<String> usersList;

//find and create list of matched strings
List<String> _getSuggestions(String query) {
    List<String> matches = List();

    matches.addAll(usersList);

    matches.retainWhere((s) => s.toLowerCase().contains(query.toLowerCase()));
    return matches;
}

//gets user list from db
void _getUsersList() async {
    usersList = await databaseHelper.getUsersList();
}


//the above code is defined in the class, before build method


//builds the text field
TypeAheadFormField(
  textFieldConfiguration: TextFieldConfiguration(
      controller: _typeAheadController,
      decoration: InputDecoration(labelText: 'Select a User'),
  suggestionsCallback: (pattern) {
    return _getSuggestions(pattern);
  },
  itemBuilder: (context, suggestion) {
    return ListTile(
      title: Text(suggestion),
    );
  },
  transitionBuilder: (context, suggestionsBox, controller) {
    return suggestionsBox;
  },
  onSuggestionSelected: (suggestion) {
    _typeAheadController.text = suggestion;

  },
  validator: (val) => val.isEmpty
      ? 'Please select a user...'
      : null,
  onSaved: (val) => setState(() => _name = val),
),



//function that pulls data from db and create a list, defined in db class
//not directly relevant but it may help someone
Future<List<String>> getUsersList() async {
    Database db = await instance.database;

    final usersData = await db.query("users");

    return usersData.map((Map<String, dynamic> row) {
      return row["name"] as String;
    }).toList();
}

PS: Одна вещь, которую мне не хватает в autocomplete_textfield, - это способ передачи нескольких параметров, поскольку мы можем наследовать от нашей собственной пользовательской модели, например, user модель.Я знаю, что это возможно, но я новичок в этом, поэтому все еще не могу заставить его работать!:(

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...