微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在我的手腕上发出更改状态不会为我的听众产生事件

如何解决在我的手腕上发出更改状态不会为我的听众产生事件

我的屏幕如下:

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());
  }

  ...
}

那应该可以解决它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。