首页 > 解决方案 > 首次尝试无法使用提供程序更新值

问题描述

我在颤振中使用提供者作为状态管理。我目前正在使用自定义身份验证而不是 firebase 身份验证进行身份验证。

我正在使用提供程序包,但是当我点击按钮提供程序时,给我的值,如电子邮件和密码不匹配,但是当我第二次按下按钮时,它给我更新的值,如电子邮件和密码是正确的。

我正在编写以下代码:

主要.dart

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [ChangeNotifierProvider(create: (_) => SignInBusinessLogic())],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: Login(),
      ),
    );
  }
}

登录.dart

class Login extends StatelessWidget {
  final SignInValidations _signInValidations = SignInValidations();
  final _formKey = GlobalKey<FormState>();
  TextEditingController _name = TextEditingController();
  TextEditingController _password = TextEditingController();

  @override
  Widget build(BuildContext context) {
    var _authStatus = Provider.of<SignInBusinessLogic>(context);
    return Scaffold(
      appBar: AppBar(
        title: Text("Login"),
      ),
      body: Form(
        key: _formKey,
        child: ListView(
          children: [
            TextFormField(
              controller: _name,
              validator: (val) => _signInValidations.validateUsernameField(val)
                  ? SignInValidationsConstants.emailEmptyValidation
                  : null,
            ),
            TextFormField(
              controller: _password,
              validator: (val) => _signInValidations.validatePasswordField(val)
                  ? SignInValidationsConstants.passwordValidation
                  : null,
            ),
            _authStatus.status == Status.Authenticating
                ? CircularProgressIndicator()
                : RaisedButton(onPressed: () async {
                    if (!_formKey.currentState.validate()) {
                      return;
                    }

                    _authStatus.validateUser(
                        _name.text, _password.text, "2423");

                    switch (_authStatus.status) {
                      case Status.Initialized:
                        print("Initialize");
                        break;
                      case Status.Validated:
                        print("Validate");
                        break;
                      case Status.FirstLogin:
                        print("First Login");
                        break;
                      case Status.DeviceIDNotMatch:
                        print("Device id not match");
                        break;
                      case Status.AccessDenied:
                        print("Access Denied");
                        break;
                      default:
                        print("Default Case");
                    }
                  })
          ],
        ),
      ),
    );
  }
}

signInBusinessLogic.dart

enum Status {
  Initialized,
  FirstLogin,
  Validated,
  AccessDenied,
  DeviceIDNotMatch,
  Authenticating
}

class SignInBusinessLogic with ChangeNotifier {
  Status _status = Status.Initialized;
  AuthServices _authServices = AuthServices();

  Status get status => _status;

  StreamSubscription<List<UserModel>> validateUser(
      String email, String password, String deviceID) {
    return _authServices.validateUser(email, password, deviceID).listen((list) {
      _status = Status.Authenticating;
      notifyListeners();
      if (list.isEmpty) {
        _status = Status.AccessDenied;
        notifyListeners();
      }
      list.map((user) {
        if (user.deviceId == deviceID) {
          _status = Status.Validated;
          print(_status);
          notifyListeners();
        } else if (user.deviceId == "") {
          _status = Status.FirstLogin;
          notifyListeners();
         
        } else {
          _status = Status.DeviceIDNotMatch;
          notifyListeners();
        }
      }).toList();
    });
  }
}

认证服务类

class AuthServices {
  final FirebaseFirestore _db = FirebaseFirestore.instance;

  ///Check if the user validates
  Stream<List<UserModel>> validateUser(
      String email, String password, String deviceID) {
    return _db
        .collection('classTeachers')
        .where('email', isEqualTo: email)
        .where('password', isEqualTo: password)
        .snapshots()
        .map((list) =>
            list.docs.map((docs) => UserModel.fromJson(docs.data())).toList());
  }
}

在此处输入图像描述

请帮助我解决我的问题。提前感谢您的宝贵时间。

标签: flutterflutter-dependenciesstate-management

解决方案


推荐阅读