Навигатор в MaterialApp - Флаттер - PullRequest
0 голосов
/ 23 марта 2020

Я написал простое приложение, когда я хочу использовать onPressed в моем build(), оно выдает мне такой тип ошибки:

Navigator operation requested with a context that does not include a Navigator.

Может кто-нибудь сказать мне, почему я не могу использовать навигатор в мой onPressed()?

Как я могу это исправить?

   @override
  Widget build(BuildContext context) {
    // double width = MediaQuery.of(context).size.width;
    return MaterialApp(
      home:Scaffold(
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(50.0),
        child: AppBar(
          title: Image(
            alignment: Alignment.center,
            image: AssetImage('assets/images/logo.png'),
            height: 70.0,
          ),
          centerTitle: true,
          iconTheme: IconThemeData(color: Color.fromRGBO(9, 133, 46, 100)),
            backgroundColor: Colors.white,
            actions: <Widget>[
              IconButton(
                icon: Icon(
                  Icons.person,
                  color: Color.fromRGBO(9, 133, 46, 100),
                  size: 30.0,       
                ),
                onPressed: () {

//HERE

                  Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => LoginScreen()));
                },
              ),
              IconButton(
                icon: Icon(
                  Icons.shopping_cart,
                  color: Color.fromRGBO(9, 133, 46, 100),
                  size: 30.0,
                ),
                onPressed: (){
                  //AND HERE :(
                },
              ),
            ],
        ),
      ),
      body: Builder(

              ...

            ),
          ),
        ),
        floatingActionButton: RawMaterialButton(
            ...
              ),
        drawer: MyDrawer(), 

      ), 
    );
  }

Ответы [ 3 ]

0 голосов
/ 23 марта 2020

Я исправляю это, создав новый класс

class UserIcon extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return IconButton(
      icon: Icon(
        Icons.person,
        color: Color.fromRGBO(9, 133, 46, 100),
        size: 30.0,  
      ),
      onPressed: () {
        Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => UserPage()));
      },
    );
  }
}
0 голосов
/ 23 марта 2020

Попробуйте создать класс с именем Home и использовать его в качестве home в MaterialApp вместо непосредственного создания Scaffold. Например,

return: MaterialApp(
home: Home(),
);

, а затем

class Home extends StatefulWidget {

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(50.0),
        child: AppBar(
          title: Image(
            alignment: Alignment.center,
            image: AssetImage('assets/images/logo.png'),
            height: 70.0,
          ),
          centerTitle: true,
          iconTheme: IconThemeData(color: Color.fromRGBO(9, 133, 46, 100)),
            backgroundColor: Colors.white,
            actions: <Widget>[
              IconButton(
                icon: Icon(
                  Icons.person,
                  color: Color.fromRGBO(9, 133, 46, 100),
                  size: 30.0,       
                ),
                onPressed: () {

//TRY MY ANSWER

                  Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => LoginScreen()));
                },
              ),
              IconButton(
                icon: Icon(
                  Icons.shopping_cart,
                  color: Color.fromRGBO(9, 133, 46, 100),
                  size: 30.0,
                ),
                onPressed: (){
                  //HOPEFULL IT WORKS :)
                },
              ),
            ],
        ),
      ),
      body: Builder(

              ...

            ),
          ),
        ),
        floatingActionButton: RawMaterialButton(
            ...
              ),
        drawer: MyDrawer(), 

      ), 
    );
  }
}

Вы получаете эту ошибку, потому что MaterialApp на самом деле является потомком MyApp. Поэтому, когда мы используем «контекст» для создания другой страницы, MyApp BuildContext не может использовать MaterialApp в качестве родителя. Таким образом, использование нового класса обычно решает эту проблему!

Скажите, не работает ли он !!!

0 голосов
/ 23 марта 2020
onPressed: _navigate

void _navigate() {
Navigator.push(
    context, MaterialPageRoute(builder: (context) => HomeScreen()));
}
...