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*
,并且您应该使用发射器来发射新值,而不是产生它。
这是我添加 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*
,并且您应该使用发射器来发射新值,而不是产生它。