Код-ревью Middle Платформенные каналы обновлено

Код-ревью: работа с платформенным каналом

Вопрос

Dart-обёртка над нативным сканером штрихкодов. Найдите проблемы.

class Scanner {
  final _channel = MethodChannel('scanner');
  final _events = EventChannel('scanner/events');

  Future<String> scan() async {
    final code = await _channel.invokeMethod('scan');
    return code;
  }

  void listen(void Function(String) onCode) {
    _events.receiveBroadcastStream().listen((e) => onCode(e));
  }

  Future<void> setUser(User user) =>
      _channel.invokeMethod('setUser', user);
}

Коротко

Каналы именуют уникально, вызовы оборачивают в обработку PlatformException, типы учитывают null. Потоки отдают как Stream, чтобы вызывающий мог отменить подписку.

Что должен найти ревьюер

  1. Стильстрока 2
    Имя канала без префикса пакета: возможен конфликт с другим плагином. Принято com.company.app/scanner.
  2. Ошибкастрока 6
    Нет обработки PlatformException (пользователь отменил, нет камеры) и MissingPluginException.
  3. Ошибкастрока 6
    Результат может быть null (отмена), а метод обещает String: упадёт приведение. Тип Future<String?> и invokeMethod<String>.
  4. Ошибкастрока 11
    Подписка не возвращается и не отменяется: нативный сканер продолжит работать и держать камеру. Вернуть StreamSubscription или Stream.
  5. Ошибкастрока 15
    Свой класс User нельзя передать стандартным кодеком: будет ошибка сериализации. Перевести в Map или описать в Pigeon.

Разбор

Каналы именуют уникально, вызовы оборачивают в обработку PlatformException, типы учитывают null. Потоки отдают как Stream, чтобы вызывающий мог отменить подписку. Свои объекты переводят в поддерживаемые типы, а лучше описывают контракт в Pigeon.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.