Flutter Dismissible Unique Keys - PullRequest
       38

Flutter Dismissible Unique Keys

0 голосов
/ 23 июня 2018

У меня есть список Dismissible виджетов следующим образом:

Dismissible(
            direction: DismissDirection.endToStart,
            key: Key(widget.data[i]),
            onDismissed: (direction) {
              widget.onRemoveRequest(i, widget.data[i]);
            },
            background: Container(
              color: Colors.red,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(right: 20.0),
                    child: Text(
                      "Delete",
                      textAlign: TextAlign.right,
                      style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.w500,
                        fontSize: 16.0,
                      ),
                    ),
                  ),
                ],
              ),
            ),
            child: CustomTextField(
              padding: const EdgeInsets.only(left: 30.0, right: 30.0),
              hintText: widget.newEntryHint,
              text: widget.data[i],
              keyboardType: TextInputType.multiline,
              onChanged: (val) {
                widget.onChanged(i, val);
              },
            ),
          )

Работает как положено, кроме случаев удаления подходящих объектов.

Примечание: widget.onRemoveRequest удаляет объект по указанному индексу из исходных данных, widget.data.

widget.data является List<String>. Я предоставляю их как key, однако всякий раз, когда у меня есть две совпадающие строки и я отклоняю одну, я получаю сообщение об ошибке, поскольку Dismissible не удаляется из дерева (понятно).

A dismissed Dismissible widget is still part of the tree.

Так что со списком строк, как я могу убедиться, что у каждого есть уникальный ключ, даже если фактические строки равны / совпадают?

1 Ответ

0 голосов
/ 23 июня 2018

Вам необходимо присвоить каждой информации уникальный идентификатор. Что-то уникальное, чтобы в нем не было дубликатов. Затем вы можете связать этот уникальный идентификатор с Key.

Это не может быть сделано только с примитивным объектом, таким как String или Int. Вам нужно будет сопоставить ваши данные с пользовательским объектом.

Хороший пример - следующий класс:

class Data {
  final String id;
  final String title;

  Data({this.id, this.title});
}

Это позволит вам затем сделать следующее:

Dismissible(
    key: Key(widget.data[i].id),
    ...
)

Вы можете создать собственный идентификатор для своих данных, используя пакет uuid или используя собственный алгоритм (такой как инкрементальный индекс).

Но убедитесь, что ваш идентификатор уникален для каждого элемента и остается неизменным в течение всего срока службы этого элемента (даже после обновления).

...