Как «многотипировать» список фиксированного порядка и фиксированной длины в Dart

В моем проекте Flutter я включил пакет lint. Где-то в моем коде есть карта Map<String, List<dynamic>> options = ...;. Список типизирован как динамический, но на самом деле это всегда нерастущий список длиной 2 [String, IconData]. Я использую карту следующим образом:

options.entries
    .map((e) => SwitchListTile(
          title: Text(e.value[0].toString()),
          secondary: Icon(e.value[1]),
          value: notificationSettings[e.key],
          onChanged: (bool value) => onNotificationChanged(topic: e.key, enabled: value),
        ))
    .toList());

т.е. String в списке — это заголовок listTile, IconData — это отображаемый значок, а ключи карты даются notificationSettings для получения текущей настройки, а также обработчику onNotificationChanged, который обновляет настройку.

Линтер говорит, что я не должен использовать переменные dynamic в тех местах, где я использовал e.value[i], поэтому мне было интересно, можно ли явно ввести нерасширяемый список фиксированного типа, например. написав что-то вроде List<String, IconData>. Я попробовал несколько интуитивных синтаксисов, но они не работают, и я ничего не могу найти в Интернете.


person Wessel    schedule 08.04.2021    source источник


Ответы (1)


Dart пока не поддерживает кортежи, но это обсуждается.

На данный момент вы должны либо создать class специально для вашей пары данных, как это (пожалуйста, дайте ему лучшее имя, которое описывает цель :)):

class StringIconDataRelation {
  final String string;
  final IconData iconData;

  const StringIconDataRelation(this.string, this.iconData);
}

В качестве альтернативы вы можете создать общий класс Pair, который можно использовать в вашем проекте:

class Pair<T1, T2> {
  final T1 a;
  final T2 b;
  
  const Pair(this.a, this.b);
}

Затем вы можете сделать так, чтобы ваш options имел тип Map<String, Pair<String, IconData>>.

В общем, часто рекомендуется создавать определенные классы для отношений, так как это может сделать код более понятным и вы можете реализовать другие соответствующие методы. Но если это для простых вещей, часто не проблема использовать класс Pair.

Вы также можете найти множество пакетов на pub.dev, которые дают вам кортежи разных размеров.

person julemand101    schedule 08.04.2021
comment
Спасибо за примеры! Это должно хорошо работать для моего варианта использования. Я также буду следить за поддержкой кортежей Dart. - person Wessel; 08.04.2021