Flutter BlocConsumer 在“等待”后停止收听新状态

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

我有同样的问题。在我的手肘内,我用 await 调用了一个 http 函数。等待呼叫后,Listener 停止收听新状态。

肘的未来功能:

Future<void> createTeam() async {
    print('-------Create button pressed------');
    if (...inProgress || ...success) return;

    ...

    emit(TeamCreateState(
      ...
    ));
    print('---------Status 0 is-------- ${state.submissionStatus.toString()}');

    try {
      String? base64Image;
      if (imageBytes != null) base64Image = base64.encode(imageBytes!);

      await _teamsRepository.createTeam(
        name: name,
        base64Image: base64Image,
        themeCode: themeCode,
      );
      print(
          '---------Status 0.5 is-------- ${state.submissionStatus.toString()}');
      //await Future<void>.delayed(const Duration(seconds: 1)); <-- this won't help

      emit(
        TeamCreateState(
          ...
        ),
      );
      print(
          '---------Status 1 is-------- ${state.submissionStatus.toString()}');
    } catch (e) {
      emit(TeamCreateState(
        ...
      ));
      print(
          '---------Status 2 is-------- ${state.submissionStatus.toString()}');
    }
  }

我的状态:

class TeamCreateState {
      const TeamCreateState({
        required this.name,
        required this.submissionStatus,
        required this.teamColor,
        this.errorMessage,
        this.imageBytes,
      });

      final String name;
      final SubmissionStatus submissionStatus;
      final String? errorMessage;
      final Uint8List? imageBytes;
      final Color teamColor;
    }

Repo 中的创建团队功能:

Future<void> createTeam({
required String name,
String? base64Image,
int? themeCode,
  }) async {
    try {
      final teamCreateFunction = cloudFunctions.httpsCallable(
        Functions.teamCreate,
      );
      await teamCreateFunction.call(<String, dynamic>{
        'teamName': name,
        'image': base64Image,
        'themeCode': themeCode,
      });
    } on FirebaseFunctionsException catch (ffe) {
      throw Exception(ffe.code);
    } catch (e) {
      throw Exception(e);
    }
  }

创建页面:

class TeamCreatePage extends StatelessWidget {
  const TeamCreatePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocProvider.value(
      value: TeamCreateCubit(context.read<TeamsRepository>()),
      child: const TeamCreateView(),
    );
  }
}

class TeamCreateView extends StatelessWidget {
  const TeamCreateView({
    Key? key,
  }) : super(key: key);    
@override
    Widget build(BuildContext context) {
        return BlocConsumer<TeamCreateCubit, TeamCreateState>(
          listener: (context, state) {
            print('---- Status Listener ---- ${state.submissionStatus}');
            if (state.submissionStatus == SubmissionStatus.success) {
              // Exit Team Creation Page.
              print('status listener exitting');
              context.goNamed(Routes.home.toName);
            } else if (state.submissionStatus == SubmissionStatus.failure) {
              ScaffoldMessenger.of(context)
                ... 'Failed to create Team!',
              ),
            ));
            }
          },
          builder: (context, state) {...}

这是结果:

如你所见:在第一次发出时,Listener 仍然在听。等待调用后,Listener 停止监听新的状态,尽管状态的状态已更改为成功。我停留在创建页面无法返回主页。

我尝试了 Equatable、listenWhen、whenComplete 等

flutter async-await state listener bloc
© www.soinside.com 2019 - 2024. All rights reserved.