Не удалось найти правильного поставщика <UserProvider>над этим виджетом регистрации - PullRequest
0 голосов
/ 12 апреля 2020

Ошибка: не удалось найти правильного поставщика выше этого виджета регистрации

Чтобы исправить, пожалуйста:

  • Убедитесь, что поставщик является предком этого виджета SignUp

  • Предоставление типов поставщику

  • Предоставление типов потребителю

  • Укажите типы для Provider.of ()

  • Убедитесь, что используется правильный context.

     class SignUp extends StatefulWidget {
      @override
      _SignUpState createState() => _SignUpState();
    }

    class _SignUpState extends State<SignUp> {
      final _formKey = GlobalKey<FormState>();
      final _key = GlobalKey<ScaffoldState>();

      TextEditingController _email = TextEditingController();
      TextEditingController _password = TextEditingController();
      TextEditingController _name = TextEditingController();
      bool hidePass = true;

      @override
      Widget build(BuildContext context) {
        final user = Provider.of<UserProvider>(context);

        return Scaffold(
          key: _key,
          body: user.status == Status.Authenticating ? Loading() : Stack(
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.only(left:20, right:20.0, top: 80),
                child: Container(
                  decoration: BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.circular(16),
                    boxShadow: [
                      BoxShadow(
                        color: Colors.grey[350],
                        blurRadius:
                        20.0, // has the effect of softening the shadow
                      )
                    ],
                  ),
                  child: Form(
                      key: _formKey,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          Padding(
                            padding: const EdgeInsets.all(16.0),
                            child: Container(
                                alignment: Alignment.topCenter,
                                child: Image.asset(
                                  'images/cart.png',
                                  width: 120.0,
    //                height: 240.0,
                                )),
                          ),
                          Padding(
                            padding:
                            const EdgeInsets.fromLTRB(14.0, 8.0, 14.0, 8.0),
                            child: Material(
                              borderRadius: BorderRadius.circular(10.0),
                              color: Colors.grey.withOpacity(0.2),
                              elevation: 0.0,
                              child: Padding(
                                padding: const EdgeInsets.only(left: 12.0),
                                child: ListTile(
                                  title: TextFormField(
                                    controller: _name,
                                    decoration: InputDecoration(
                                        hintText: "Full name",
                                        icon: Icon(Icons.person_outline),
                                        border: InputBorder.none),
                                    validator: (value) {
                                      if (value.isEmpty) {
                                        return "The name field cannot be empty";
                                      }
                                      return null;
                                    },
                                  ),
                                ),
                              ),
                            ),
                          ),
                          Padding(
                            padding:
                            const EdgeInsets.fromLTRB(14.0, 8.0, 14.0, 8.0),
                            child: Material(
                              borderRadius: BorderRadius.circular(10.0),
                              color: Colors.grey.withOpacity(0.2),
                              elevation: 0.0,
                              child: Padding(
                                padding: const EdgeInsets.only(left: 12.0),
                                child: ListTile(
                                  title: TextFormField(
                                    controller: _email,
                                    decoration: InputDecoration(
                                        hintText: "Email",
                                        icon: Icon(Icons.alternate_email),
                                        border: InputBorder.none),
                                    validator: (value) {
                                      if (value.isEmpty) {
                                        Pattern pattern =
                                            r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
                                        RegExp regex = new RegExp(pattern);
                                        if (!regex.hasMatch(value))
                                          return 'Please make sure your email address is valid';
                                        else
                                          return null;
                                      }
                                      return null;
                                    },
                                  ),
                                ),
                              ),
                            ),
                          ),

                          Padding(
                            padding:
                            const EdgeInsets.fromLTRB(14.0, 8.0, 14.0, 8.0),
                            child: Material(
                              borderRadius: BorderRadius.circular(10.0),
                              color: Colors.grey.withOpacity(0.2),
                              elevation: 0.0,
                              child: Padding(
                                padding: const EdgeInsets.only(left: 12.0),
                                child: ListTile(
                                  title: TextFormField(
                                    controller: _password,
                                    obscureText: hidePass,
                                    decoration: InputDecoration(
                                        hintText: "Password",
                                        icon: Icon(Icons.lock_outline),
                                        border: InputBorder.none),
                                    validator: (value) {
                                      if (value.isEmpty) {
                                        return "The password field cannot be empty";
                                      } else if (value.length < 6) {
                                        return "the password has to be at least 6 characters long";
                                      }
                                      return null;
                                    },
                                  ),
                                  trailing: IconButton(
                                      icon: Icon(Icons.remove_red_eye),
                                      onPressed: () {
                                        setState(() {
                                          hidePass = false;
                                        });
                                      }),
                                ),
                              ),
                            ),
                          ),

                          Padding(
                            padding:
                            const EdgeInsets.fromLTRB(14.0, 8.0, 14.0, 8.0),
                            child: Material(
                                borderRadius: BorderRadius.circular(20.0),
                                color: deepOrange,
                                elevation: 0.0,
                                child: MaterialButton(
                                  onPressed: () async{
                                    if(_formKey.currentState.validate()){
                                      if(!await user.signUp(_name.text ,_email.text, _password.text))
                                        _key.currentState.showSnackBar(SnackBar(content: Text("Sign up failed")));
                                    }
                                  },
                                  minWidth: MediaQuery.of(context).size.width,
                                  child: Text(
                                    "Sign up",
                                    textAlign: TextAlign.center,
                                    style: TextStyle(
                                        color: white,
                                        fontWeight: FontWeight.bold,
                                        fontSize: 20.0),
                                  ),
                                )),
                          ),
                          Padding(
                              padding: const EdgeInsets.all(8.0),
                              child: InkWell(
                                  onTap: () {
                                    Navigator.pop(context);
                                  },
                                  child: Text(
                                    "I already have an account",
                                    textAlign: TextAlign.center,
                                    style: TextStyle(color: deepOrange, fontSize: 16),
                                  ))),

                          Padding(
                            padding: const EdgeInsets.all(16.0),
                            child: Row(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: <Widget>[

                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Text("Or sign up with", style: TextStyle(fontSize: 18,color: Colors.grey),),
                                ),
                                Padding(
                                  padding:
                                  const EdgeInsets.fromLTRB(14.0, 8.0, 14.0, 8.0),
                                  child: Material(
                                      child: MaterialButton(
                                          onPressed: () async{
                                            if(!await user.signUpWithGoogle())
                                              _key.currentState.showSnackBar(SnackBar(content: Text("Sign in failed")));

                                          },
                                          child: Image.asset("assets/google-48.png", width: 30,)
                                      )),
                                ),
                              ],
                            ),
                          ),
                        ],
                      )),
                ),
              ),
            ],
          ),
        );
      }

    }

keep получаю ошибку что я делаю не так

...