问题描述
我的屏幕如下:
import 'package:Flutter/material.dart';
import 'package:Flutter_bloc/Flutter_bloc.dart';
import 'package:app/flows/splashscreen/splash_screen_cubit.dart';
import 'package:Flutter_spinkit/Flutter_spinkit.dart';
import 'package:rFlutter_alert/rFlutter_alert.dart';
class SplashScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocConsumer<SplashScreenCubit,SplashScreenState>(
listener: (context,state) {
debugPrint("listener received something");
if (state is SplashScreenCheckingToken) {
debugPrint("state is SplashScreenCheckingToken");
context.bloc<SplashScreenCubit>().checkingAccesstoken();
} else if (state is SplashScreenTokenValid) {
Navigator.pushNamed(context,'/home');
} else if (state is SplashScreenTokenInvalid) {
Navigator.pushNamed(context,'/landing-page');
} else if (state is SplashScreenError) {
_showError(context);
}
},builder: (context,state) {
if (state is SplashScreenInitial) {
debugPrint("state is SplashScreenInitial");
context
.bloc<SplashScreenCubit>()
.checkAccesstoken(); // doesn't work,but why?
// context.bloc<SplashScreenCubit>().checkingAccesstoken(); // works
return Scaffold(
body:
Container(color: Colors.green,child: _loadingWidget(context)));
} else {
return Container();
}
});
}
SpinKitChasingDots _loadingWidget(BuildContext context) {
return SpinKitChasingDots(
color: Colors.white,size: 50.0,);
}
Future<bool> _showError(BuildContext context) {
return Alert(context: context,title: "Error",desc: "Something went wrong")
.show();
}
}
我的手肘像这样:
import 'package:bloc/bloc.dart';
import 'package:Flutter/material.dart';
import 'package:app/repository/api_repository.dart';
part 'splash_screen_state.dart';
class SplashScreenCubit extends Cubit<SplashScreenState> {
final APIRepository _apiRepository;
SplashScreenCubit(this._apiRepository) : super(SplashScreenInitial());
void checkAccesstoken() {
debugPrint("checkAccesstoken begin");
emit(SplashScreenCheckingToken());
debugPrint("checkAccesstoken finished");
}
Future<void> checkingAccesstoken() async {
try {
final quote = await _apiRepository.fetchQuote();
debugPrint(quote.toString());
emit(SplashScreenTokenValid());
} on Error {
emit(SplashScreenError());
}
}
void accesstokenValid() {
emit(SplashScreenTokenValid());
}
void accesstokenInvalid() {
emit(SplashScreenTokenInvalid());
}
}
我的状态如下:
part of 'splash_screen_cubit.dart';
enum SplashScreenStateEnum {
Initial,CheckingToken,TokenValid,TokenInvalid,Error,}
abstract class SplashScreenState {
final SplashScreenStateEnum splashScreenStateEnum;
const SplashScreenState(this.splashScreenStateEnum);
}
class SplashScreenInitial extends SplashScreenState {
const SplashScreenInitial() : super(SplashScreenStateEnum.Initial);
}
class SplashScreenCheckingToken extends SplashScreenState {
const SplashScreenCheckingToken()
: super(SplashScreenStateEnum.CheckingToken);
@override
bool operator ==(Object o) {
if (identical(this,o)) return true;
return o is SplashScreenCheckingToken &&
o.splashScreenStateEnum == splashScreenStateEnum;
}
@override
int get hashCode => splashScreenStateEnum.hashCode;
}
class SplashScreenTokenValid extends SplashScreenState {
const SplashScreenTokenValid() : super(SplashScreenStateEnum.TokenValid);
@override
bool operator ==(Object o) {
if (identical(this,o)) return true;
return o is SplashScreenTokenValid &&
o.splashScreenStateEnum == splashScreenStateEnum;
}
@override
int get hashCode => splashScreenStateEnum.hashCode;
}
class SplashScreenTokenInvalid extends SplashScreenState {
const SplashScreenTokenInvalid() : super(SplashScreenStateEnum.TokenInvalid);
@override
bool operator ==(Object o) {
if (identical(this,o)) return true;
return o is SplashScreenTokenInvalid &&
o.splashScreenStateEnum == splashScreenStateEnum;
}
@override
int get hashCode => splashScreenStateEnum.hashCode;
}
class SplashScreenError extends SplashScreenState {
const SplashScreenError() : super(SplashScreenStateEnum.Error);
@override
bool operator ==(Object o) {
if (identical(this,o)) return true;
return o is SplashScreenError &&
o.splashScreenStateEnum == splashScreenStateEnum;
}
@override
int get hashCode => splashScreenStateEnum.hashCode;
}
Flutter: state is SplashScreenInitial
Flutter: checkAccesstoken begin
Flutter: checkAccesstoken finished
这意味着,尽管Cubit中的checkAccesstoken()函数被触发,但SplashScreen上BlocConsumer的侦听器中没有任何事件进入。
否则它将打印:
"listener received something"
我不知道为什么,因为当我在Cubit中尝试checkingAccesstoken()函数时,确实会为侦听器产生事件。
解决方法
您的 SplashScreenCheckingToken
负责所有其他“重定向”状态,但它从未被触发。也许你可以做的是在初始化后修改你的cubit构造函数。
class SplashScreenCubit extends Cubit<SplashScreenState> {
final APIRepository _apiRepository;
SplashScreenCubit(this._apiRepository) : super(SplashScreenInitial()) {
emit(SplashScreenCheckingToken());
}
...
}
那应该可以解决它。