您使用了“BuildContext”,它是您尝试读取的提供程序的祖先

问题描述 投票:0回答:1

错误:无法在此 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;
  }

}


flutter bloc flutter-bloc
1个回答
0
投票

您可以将

Scaffold
提取到新的小部件中,或者用
Builder
包裹它。

context.read<SportsBloc>().add(GetRegisterEvent())
中的
onTap
使用的是
BuildContext
上方的
RegisterScreen
BlocProvider

© www.soinside.com 2019 - 2024. All rights reserved.