Flutter Bloc:Ui 不会使用 Stream 发出的数据进行更新

问题描述 投票:0回答:1

在我的应用程序中,我添加了一个监听文档更改的流(该文档包含一些

String
字段和
List<String>
数组)

区块代码:

  void _onPageHomeGetUserData(
    PageHomeGetUserDataEvent event,
    Emitter<PageHomeState> emit,
  ) async {
    final currentUser = _authService.currentUser();

    _userStreamSubscription = _userRepository
        .getDocumentStream(
            '${FirestoreConstants.userCollection}/${currentUser.id}')
        .listen((event) {
      add(PageHomeGetUserDataEmitEvent(event));
    });
  }

  void _onPageHomeGetUserDataEmitEvent(
    PageHomeGetUserDataEmitEvent event,
    Emitter<PageHomeState> emit,
  ) async {
    emit(state.copyWith(userData: event.userData));
  }

区块状态:

class PageHomeState extends Equatable {
  final PageState pageState;
  final UserEntity userData;
  final List<EventStatusEntity> events;
  const PageHomeState({
    this.pageState = PageState.initial,
    this.userData = const UserEntity(
      email: '',
      events: [],
      name: '',
      reports: [],
      id: '',
    ),
    this.events = const [],
  });

  @override
  List<Object> get props => [pageState, userData, events];

  PageHomeState copyWith({
    PageState? pageState,
    UserEntity? userData,
    List<EventStatusEntity>? events,
  }) {
    return PageHomeState(
      pageState: pageState ?? this.pageState,
      userData: userData ?? this.userData,
      events: events ?? this.events,
    );
  }
}

用户实体:

class UserEntity extends Equatable implements Serializable {
  final String email;
  final List<String> events;
  final String name;
  final List<String> reports;
  final String id;
  const UserEntity({
    required this.email,
    required this.events,
    required this.name,
    required this.reports,
    required this.id,
  });

  @override
  Map<String, dynamic> toMap() {
    return {
      'email': email,
      'events': events,
      'name': name,
      'reports': reports,
      'id': id,
    };
  }

  @override
  List<Object> get props {
    return [
      email,
      events,
      name,
      reports,
      id,
    ];
  }

  UserEntity copyWith({
    String? email,
    List<String>? events,
    String? name,
    List<String>? reports,
    String? id,
  }) {
    return UserEntity(
      email: email ?? this.email,
      events: events ?? this.events,
      name: name ?? this.name,
      reports: reports ?? this.reports,
      id: id ?? this.id,
    );
  }
}

通过按下按钮,我更新文档(我已检查并且文档更新正确),但

UI
不更新

奇怪的是,我尝试手动更改 firestore 中的文档,并且 ui 也会相应更新

flutter google-cloud-firestore stream bloc
1个回答
0
投票

问题似乎出在这段代码上:

  void _onPageHomeSwitchFavoriteEvent(
    PageHomeSwitchFavoriteEvent event,
    Emitter<PageHomeState> emit,
  ) async {
    final userData = state.userData;
    if (event.isFavorite) {
      userData.events.remove(event.eventId);
    } else {
      userData.events.add(event.eventId);
    }

    _userRepository.update(
      '${FirestoreConstants.userCollection}/${userData.id}',
      userData,
    );
  }

现在我已将其更改为:

  void _onPageHomeSwitchFavoriteEvent(
    PageHomeSwitchFavoriteEvent event,
    Emitter<PageHomeState> emit,
  ) async {
    final userData = state.userData;
    List<String> tempList = [];
    tempList.addAll(userData.events);
    if (event.isFavorite) {
      tempList.remove(event.eventId);
    } else {
      tempList.add(event.eventId);
    }

    _userRepository.update(
      '${FirestoreConstants.userCollection}/${userData.id}',
      userData.copyWith(events: tempList),
    );
  }

有效

© www.soinside.com 2019 - 2024. All rights reserved.