Onchange providerlistener 函数单独返回加载状态

问题描述

我正在使用提供程序侦听器获取状态值,然后在状态有错误时返回小吃栏,或者在状态完成值时导航到另一个页面。 这是我的用户界面

return ProviderListener<LoginState>(
   provider: loginControllerProvider,onChange: (BuildContext context,value) {
   if (value.loginStatus == Status.COMPLETED) {
      print('redirect');
   }
   if (value.loginStatus == Status.ERROR) {
       print('error');
 } 
 if (value.loginStatus == Status.LOADING) {
     print('loading');
 } 
},

我的供应商

 final loginControllerProvider = StateNotifierProvider.autodispose<LoginController,LoginState>(
    (ref) => LoginController(ref.read));

我的状态通知

class LoginController extends StateNotifier<LoginState> {
  LoginController(this._read) : super(LoginState.initial());

  final Reader _read;

  void login(String email,String password) async {
      state = state.copyWith(loginStatus: Status.LOADING,isAuthenticated: false);
      final response = await _read(authRepositoryProvider).doLogin(email,password);
      if (response is AppException) {
          state = state.copyWith(
             loginStatus: Status.ERROR,error: response.toString(),isAuthenticated: false);
      } else {
          state = state.copyWith(loginStatus: Status.COMPLETED,isAuthenticated: true);
   }
 }
}

我的登录状态

enum Status { INITIAL,LOADING,COMPLETED,ERROR }

class LoginState extends Equatable {
  final Status loginStatus;
  final String? error;
  final bool isAuthenticated;

  LoginState(
    {required this.loginStatus,this.error,required this.isAuthenticated});

     factory LoginState.initial() {
       return LoginState(loginStatus: Status.INITIAL,isAuthenticated: false);
    }

    LoginState copyWith(
       {required Status loginStatus,String? error,required bool isAuthenticated}) {
       return LoginState(
       loginStatus: loginStatus,error: error,isAuthenticated: isAuthenticated);
    }

  @override
   List<Object?> get props => [loginStatus,error,isAuthenticated];
 }

最后是调用登录方法函数

onTap: () => context
                        .read(loginControllerProvider.notifier)
                        .login(emailEditingController.text,passwordEditingController.text),

问题是即使 login 方法中的 state 实际发生了变化,onchange 方法即使有错误也只返回打印加载语句。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)