операция навигатора запрошена с контекстом, который не включает виджет состояния навигатора

Я работаю над следующим кодом Flutter. У меня проблемы со второй кнопкой "Regitrese". Каждое место, которое я искал, работает с виджетами без состояния, поэтому я не уверен, как это исправить. Я попытался изменить пустоту, чтобы поместить ее домой: MyHomePage () и поместить MyHomePage в statefull вместо того, чтобы брать statefull из шины MyApp, это показывает ошибку. Отсутствует конкретная реализация StatefulWidget.createState. Я не уверен, как это должно идти. Можете ли вы заставить кнопку работать в StatefulWidget? Есть какой-то трюк, которого я не вижу?

void main()=> runApp(new MyApp());

class MyApp extends StatefulWidget{
 @override
   State<StatefulWidget> createState(){
     return new MyHomePage();
   }
}

class MyHomePage extends State<MyApp>{
 final TextEditingController rutController = TextEditingController();
 final TextEditingController passwordController = TextEditingController();
 var _rut, _password;

 @override
 Widget build(BuildContext context) {
   return new MaterialApp(
   home: new Scaffold(
    body: new Container(
      padding: const EdgeInsets.all(50.0),
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          TextFormField(
            controller: this.rutController,
            decoration: InputDecoration(
              labelText: 'Rut',
              hintText: 'eg. 154683265',
                suffixIcon: IconButton(
                  icon: Icon(Icons.clear),
                  onPressed: () {
                    rutController.clear();
                  }
                )
            ),
          ),
          TextFormField(
            controller: this.passwordController,
            decoration: InputDecoration(
              labelText: 'Contraseña',
              hintText: 'Contraseña',
                suffixIcon: IconButton(
                    icon: Icon(Icons.clear),
                    onPressed: () {
                      passwordController.clear();
                    },
                )
            ),
            obscureText: true,
          ),
          RaisedButton(
            onPressed: (){
              loginButton(rut: this.rutController.text, password: this.passwordController.text);
            },
            child: Text('Login'),
          ),
          RaisedButton(
            onPressed: (){
              Navigator.push(
                 context,
                 MaterialPageRoute(builder(context)=>SelectUserPage())
              )
            },
            child: Text('Registrese'),
          ),
        ],
      ),
    ),
  ),
 );
}
}

class SelectUserType extends StatelessWidget{
 @override
 Widget build(BuildContext context){
  return new Container(
   child: new Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: <Widget>[
      RaisedButton(
        onPressed: (){
          //Do something
        },
        child: Text(''),
      ),
      RaisedButton(
        onPressed: (){
          //Do something
        },
        child: Text(''),
      ),
    ],
  ),
);
}
}

person Ricardo Javier Chavarra Gonzal    schedule 14.12.2018    source источник


Ответы (1)


Дело в том, что вам нужно получить доступ к контексту ниже виджета MaterialApp, который добавляет Navigator в дерево. Если вы посмотрите на свой код, над ним будет context.

Один из способов ее решения — переместить часть дерева в другой виджет.

Или вы можете использовать Builder вокруг кнопки или вокруг Column, как в следующем коде:

      Builder(
        builder: (context) => RaisedButton(
              onPressed: () {
                Navigator.push(context,
                    MaterialPageRoute(
                        builder: (context) => SelectUserType()));
              },
              child: Text('Registrese'),
            ),
      ),
person chemamolins    schedule 14.12.2018
comment
вы сделали мой день :) - person Mimu Saha Tishan; 17.09.2020