Bloc Dart:当我将 async* 添加到 my_bloc_bloc.dart 文件中的 on<Event> 函数时,添加带有 flutter_bloc 的事件不会产生任何效果

Bloc Dart : When I add async* to my on<Event> function in my_bloc_bloc.dart file , add an event with flutter_bloc does not make anything

这是我添加 async* 时的代码(Hello World! 未打印):

import 'package:alltoo_mobile/authenticate/bloc/authenticate_bloc.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

part 'login_event.dart';
part 'login_state.dart';

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  AuthenticateBloc _authenticateBloc;
  LoginBloc(this._authenticateBloc) : super(LoginInitial()) {
    on<LoginEvent>((event, emit) async* {
      print("Hello World!");
      // if (event is LoginButtonPressed) yield * _mapLoginButtonPressed(event);
    });
  }
  Stream<LoginState> _mapLoginButtonPressed(LoginButtonPressed event) async* {
    yield LoginInitial();
  }
} 

这是我在 Hello World 时的代码!已打印(我刚刚删除了 async*):

import 'package:alltoo_mobile/authenticate/bloc/authenticate_bloc.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

part 'login_event.dart';
part 'login_state.dart';

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  AuthenticateBloc _authenticateBloc;
  LoginBloc(this._authenticateBloc) : super(LoginInitial()) {
    on<LoginEvent>((event, emit){
      print("Hello World!");
      // if (event is LoginButtonPressed) yield * _mapLoginButtonPressed(event);
    });
  }
  Stream<LoginState> _mapLoginButtonPressed(LoginButtonPressed event) async* {
    yield LoginInitial();
  }
} 

我在 login.dart 文件中添加事件的位置(这个 Inkwell 在 Material 小部件中):

InkWell(
  onTap: () {
    if (_formKey.currentState!.validate()) {
      BlocProvider.of<LoginBloc>(context).add(
          LoginButtonPressed(
              username: _usernameController.text,
              password: _passwordController.text));
    }
  },
  borderRadius: BorderRadius.circular(14.0),
  child: Center(
    child: Text(
      'Login',
      style: heading5.copyWith(color: Colors.white),
    ),
  ),
),

我在 main.dart 文件中创建我的 bloc 的地方:

BlocBuilder<AuthenticateBloc, AuthenticateState>(
  builder: (context, state) {
    if (state is AuthenticateLogged) return Calendar();
    return BlocProvider<LoginBloc>(
      create: (context) =>
          LoginBloc(BlocProvider.of<AuthenticateBloc>(context)),
      child: LoginPage(),
    );
  },
),

bloc事件不可能有return类型的Stream<state>,那是旧版本bloc的东西,现在所有事件都必须returnFuture<void>void,这意味着如果您添加 async* 关键字,您的事件将被忽略,我相信这就是 hello world 不打印的原因。

这是执行您可能想要执行的操作的方法:

LoginBloc(this._authenticateBloc) : super(LoginInitial()) {
    on<LoginButtonPressed>((event, emit){      
      print('hello world');
      emit(_mapLoginButtonPressed(event));
    });
  }
   LoginState _mapLoginButtonPressed(LoginButtonPressed event) {
    return LoginInitial();
  }
} 

您可以创建事件 async,但不能 async* 不能 sync*,并且您应该使用发射器来发射新值,而不是产生它。