Как набрать приведение для моего варианта использования в Dart 2 - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь очистить некоторый (рабочий) код на развилке проекта Flutter Architecture Samples github.У кого-нибудь, кто знаком с кастингом в Dart 2, есть какие-либо предложения о том, как очистить мою попытку?

Это может измениться после публикации, но у меня сейчас есть:

Stream<List<TodoEntity>> todos() {
  return firebase.reference().child(path).onValue.map((event) {
    if (event.snapshot == null || event.snapshot.value == null) return [];
    return Map
      .castFrom(event.snapshot.value.map((key, doc) {
        return MapEntry(
            key,
            TodoEntity(
              doc['task'],
              key,
              doc['note'] ?? '',
              doc['complete'] ?? false,
            ));
      }))
      .values
      .toList()
      .cast();
    });
}

I'mПри многократном приведении я ожидаю, что смогу удалить .cast() и быть более точным в отношении типов, чтобы компилятор знал, что делать, и его было легче читать и понимать.

Полный код в настоящее время можно найти наmy fork

кстати: приложение flutter_redux flutter работает с firestore , я добавил поддержку, чтобы оно работало с firebaseбаза данных реального времени , включая тесты.

редактировать: Благодаря Rémi Rousselet , следующие работы без приведения:

Stream<List<TodoEntity>> todos() {
  return firebase.reference().child(path).onValue.map((event) {
    if (event.snapshot == null || event.snapshot.value == null) return [];
    final Map<dynamic, dynamic> value = event.snapshot.value;
    final todoMap = value.map((key, doc) {
      return MapEntry(
        key,
        TodoEntity(
          doc['task'],
          key,
          doc['note'] ?? '',
          doc['complete'] ?? false,
        ));
    });
    return todoMap.values.toList();
  });
}

1 Ответ

0 голосов
/ 12 мая 2018

На самом деле, вы можете удалить намного больше, чем только последний cast, а также проверить тип.

final Map<String, dynamic> value;
final foo = value.map((key, doc) {
  return MapEntry(
      key,
      TodoEntity(
        doc['task'],
        key,
        doc['note'] ?? '',
        doc['complete'] ?? false,
      ));
});
final values = foo.values.toList();

Дарт автоматически выведет тип соответственно. Так что foo имеет тип Map<String, TodoEntity> и values типа List<TodoEntity>

...