错误:无法在此 RegisterScreen 小部件上方找到正确的提供程序
发生这种情况是因为您使用了不包含提供程序的
BuildContext
由您选择。有以下几种常见场景:
您在
main.dart
中添加了一个新的提供程序并执行了热重载。
要修复此问题,请执行热重启。
您尝试阅读的提供商处于不同的路线。
提供商具有“范围”。因此,如果您在路线中插入提供者,那么 其他路线将无法访问该提供商。
您使用的
BuildContext
是您尝试读取的提供者的祖先。
确保RegisterScreen位于您的MultiProvider/Provider下。 当您创建提供程序并尝试立即读取它时,通常会发生这种情况。
class RegisterScreen extends StatefulWidget {
const RegisterScreen({super.key});
@override
State<RegisterScreen> createState() => _RegisterScreenState();
}
class _RegisterScreenState extends State<RegisterScreen> {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _fullNameController = TextEditingController();
final TextEditingController _passController = TextEditingController();
final TextEditingController _confirmPasswordController = TextEditingController();
bool isLoading = false;
@override
void dispose() {
_emailController.dispose();
_fullNameController.dispose();
_passController.dispose();
_confirmPasswordController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => SportsBloc(AuthService(), LoginAuth()),
child: BlocListener<SportsBloc,SportsState>(
listener: (context,state){
if(state is GetRegisterState){
UserCredential userCredential = state.userCredential;
if(userCredential.user != null){
context.read<SportsBloc>().add(GetUploadInfoEvent(state.email, state.fullName, state.userUid));
} else {
setState(() {
isLoading = false;
});
Fluttertoast.showToast(msg: "Failed to register..");
}
}
if(state is GetUploadInfoState){
bool isSuccessful = state.isSuccessful;
if(isSuccessful){
setState(() {
isLoading = false;
});
Fluttertoast.showToast(msg: "Account Successfully created");
Get.offAndToNamed(AppRouting.homeScreen);
} else {
// unregister the user
setState(() {
isLoading = false;
});
Fluttertoast.showToast(msg: "Failed to create an account");
context.read<SportsBloc>().add(GetDeleteUserEvent());
}
}
if(state is GetDeleteUserState){
bool isDeleted = state.isDeleted;
if(isDeleted){
print("Account successfully deleted");
} else {
print("Failed to delete account");
}
}
},
child: SafeArea(
child: Scaffold(
body: Padding(
padding: const EdgeInsets.all(20),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(child: Image.asset("assets/images/sport.png",width: 200,height: 150,fit: BoxFit.cover,)),
Text("Register",style: Utils.getBoldFont().copyWith(fontSize: 30),),
const SizedBox(height: 20,),
Text("Email",style: Utils.getMediumFont(),),
const SizedBox(height: 5,),
CustomEditText(hint: "Email", iconData: Icons.email_outlined,
textEditingController: _emailController, isPass: false,),
const SizedBox(height: 20,),
Text("Email",style: Utils.getMediumFont(),),
const SizedBox(height: 5,),
CustomEditText(hint: "Full Name", iconData: Icons.person,
textEditingController: _fullNameController, isPass: false,),
const SizedBox(height: 20,),
Text("Password",style: Utils.getMediumFont(),),
const SizedBox(height: 5,),
CustomEditText(hint: "Password", iconData: Icons.password,
textEditingController: _passController, isPass: true,),
const SizedBox(height: 20,),
Text("Confirm Password",style: Utils.getMediumFont(),),
const SizedBox(height: 5,),
CustomEditText(hint: "Confirm Password", iconData: Icons.password,
textEditingController: _confirmPasswordController, isPass: true,),
const SizedBox(height: 40,),
Center(child: Text("Have an account? Login",style: Utils.getMediumFont().copyWith(fontSize: 17),)),
const SizedBox(height: 30,),
Center(
child: CustomButton(
text: "Register",
onTap: () {
// REGISTER USER
var email = _emailController.text.trim();
var fullName = _fullNameController.text.trim();
var password = _passController.text.trim();
var confirmPassword = _confirmPasswordController.text.trim();
// Perform validation checks
if (!_showToast(email, "Email cannot be empty")) return;
if (!_showToast(fullName, "Full Name cannot be empty")) return;
if (!_showToast(password, "Password cannot be empty")) return;
if (!_showToast(confirmPassword, "Confirm Password cannot be empty")) return;
if (!_isValidEmail(email)) return;
if (!_checkPasswordLength(password, "Password length cannot be less than 6")) return;
if (!_checkPasswordLength(confirmPassword, "Confirm Password length cannot be less than 6")) return;
if (!_doPasswordsMatch(password, confirmPassword)) return;
// All validations passed, proceed with registration
setState(() {
isLoading = true;
});
context.read<SportsBloc>().add(GetRegisterEvent(
email,
password,
fullName,
FirebaseAuth.instance.currentUser!.uid
));
},
isLoading: isLoading,
),
)
],
),
),
),
),
),
),
);
}
bool _showToast(String value, String msg) {
if (value.isEmpty) {
Fluttertoast.showToast(msg: msg);
return false;
}
return true;
}
bool _checkPasswordLength(String password, String msg) {
if (password.length < 6) {
Fluttertoast.showToast(msg: msg);
return false;
}
return true;
}
bool _isValidEmail(String email) {
String emailPattern = r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
RegExp regExp = RegExp(emailPattern);
if (!regExp.hasMatch(email)) {
Fluttertoast.showToast(msg: "Email is not valid");
return false;
}
return true;
}
bool _doPasswordsMatch(String password, String confirmPassword) {
if (password != confirmPassword) {
Fluttertoast.showToast(msg: "Both Passwords do not match");
return false;
}
return true;
}
}
您可以将
Scaffold
提取到新的小部件中,或者用 Builder
包裹它。
context.read<SportsBloc>().add(GetRegisterEvent())
中的onTap
使用的是BuildContext
上方的
RegisterScreen
的
BlocProvider