问题描述
我的屏幕如下:
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()函数时,确实会为侦听器产生事件。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)