我有同样的问题。在我的手肘内,我用 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 等