flutter - 首次尝试无法使用提供程序更新值
问题描述
我在颤振中使用提供者作为状态管理。我目前正在使用自定义身份验证而不是 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());
}
}
请帮助我解决我的问题。提前感谢您的宝贵时间。