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