Riverpod ProviderListener onchange 方法显示空值

问题描述

所以我刚开始使用riverpod,我遇到了这个奇怪的错误。我正在监听一个提供者,该提供者公开一个控制器,该控制器具有在单击按钮时更改状态的方法。因此,我们的想法是让用户输入他的电子邮件,如果它存在于我们后端服务器的数据库中,您会收到一个错误显示“电子邮件存在”,但如果没有,它会将您导航到另一个页面。该代码工作正常,但唯一的问题是它将我导航到另一个页面,然后抛出电子邮件存在错误。我的代码在下面

class IntroScreen extends HookWidget {
  final TextEditingController emailEditingController = TextEditingController();
  final _scaffoldKey = GlobalKey<ScaffoldState>();

  ...
 
   @override
   Widget build(BuildContext context) {
     return ProviderListener<AuthenticatingUser>(
     provider: registerauthControllerProvider,onChange: (BuildContext context,value) {
     if (value.authenticating) {}
     if (value.email == null) {
      final snackBar = SnackBar(
        duration: Duration(seconds: 2),backgroundColor: Colors.black,content: Text('Email Already Exists,Kindly login to continue'),);
      ScaffoldMessenger.of(context).showSnackBar(snackBar);
    } else {
      Navigator.of(context).pushReplacementNamed('/signuppersonal');
    }
  },child: Scaffold()
}

供应商

 final registerauthControllerProvider = StateNotifierProvider.autodispose<
 RegisterauthController,AuthenticatingUser>((ref) => RegisterauthController(ref.read));
 

状态类

import 'package:equatable/equatable.dart';

class AuthenticatingUser extends Equatable {
  final String? email;
  final bool authenticating;

  AuthenticatingUser({
  this.email,required this.authenticating,});

factory AuthenticatingUser.initial() {
   return AuthenticatingUser(
      email: null,authenticating: false,);
}

AuthenticatingUser copyWith(
  {
  String? email,required bool authenticating,}) {
return AuthenticatingUser(
    authenticating: authenticating,email: email,);
}

@override
List<Object?> get props =>
  [email,authenticating];
}

最后是我的控制器类

class RegisterauthController extends StateNotifier<AuthenticatingUser> {
 RegisterauthController(this._read) : super(AuthenticatingUser.initial());

 final Reader _read;

 void updateEmail(String email) async {
   state = state.copyWith(authenticating: true);
   final getEmail = await _read(authRepositoryProvider).checkEmail(email);
   if (getEmail == 'Email Already Exists') {
   state = state.copyWith(authenticating: false);
  }
 state = state.copyWith(authenticating: false,email: email);
 }
}

解决方法

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

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

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