MaterialPageRoute переходит на новую страницу без панели приложения, используя ее с bottomNavigationBar - PullRequest
0 голосов
/ 30 октября 2019

У меня есть приложение с тремя маршрутами, и я использую bottomNavigationBar для навигации между ними. На одном из маршрутов у меня есть кнопка на странице, которая также будет переходить на одну из страниц.

Вот моя главная страница

import 'package:flutter/material.dart';

import 'page_two.dart';
import 'page_three.dart';

void main() {
  return runApp(MyApp());
}

/// This Widget is the main application widget.
class MyApp extends StatelessWidget {
  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: _title,
      home: MyStatefulWidget(),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  MyStatefulWidget({Key key}) : super(key: key);

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _selectedIndex = 0;

  List<Widget> _widgetOptions = <Widget>[
    Text('Main'),
    PageTwo(),
    PageThree(),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;

    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('BottomNavigationBar Sample'),
      ),
      body: Center(
        child: _widgetOptions.elementAt(_selectedIndex),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.home, color: Colors.black),
            title: Text('Home'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.business, color: Colors.black),
            title: Text('Business'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.business, color: Colors.black),
            title: Text('Business'),
          ),
        ],
        currentIndex: _selectedIndex,
        selectedItemColor: Colors.amber[800],
        onTap: _onItemTapped,
      ),
    );
  }
}

Вторая страница

import 'package:flutter/material.dart';

import 'main.dart';

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        child: Text('Go page 1'),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => MyApp()),
          );
        },
      ),
    );
  }
}

и третья страница с кнопкой, которая переходит ко второй странице

import 'package:flutter/material.dart';

import 'page_two.dart';

class PageThree extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        child: Text('Go page 1'),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => PageTwo()),
          );
        },
      ),
    );
  }
}

Когда я нажимаю кнопку на третьей странице, она переходит на вторую страницу без панели приложений и панели навигации BottomNavigation

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Использование GlobalKey и InTget виджета PageTwo вызывают функцию _onItemTapped MyStatefulWidgetState
Ниже вы можете увидеть рабочую демонстрацию и полный код
фрагмент кода

final scakey = new GlobalKey<_MyStatefulWidgetState>();
...
child: Text('Go page 2'),
    onPressed: () {
      scakey.currentState._onItemTapped(1);  

enter image description here

полный код

import 'package:flutter/material.dart';

void main() {
  return runApp(MyApp());
}

final scakey = new GlobalKey<_MyStatefulWidgetState>();

/// This Widget is the main application widget.
class MyApp extends StatelessWidget {
  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: _title,
      home: MyStatefulWidget(key: scakey),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  MyStatefulWidget({Key key}) : super(key: key);

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _selectedIndex = 0;

  final myKey = new GlobalKey<_MyStatefulWidgetState>();

  List<Widget> _widgetOptions = <Widget>[
    Text('Main'),
    PageTwo(),
    PageThree(),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: myKey,
      appBar: AppBar(
        title: const Text('BottomNavigationBar Sample'),
      ),
      body: Center(
        child: _widgetOptions.elementAt(_selectedIndex),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.home, color: Colors.black),
            title: Text('Home'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.business, color: Colors.black),
            title: Text('Business'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.business, color: Colors.black),
            title: Text('Business'),
          ),
        ],
        currentIndex: _selectedIndex,
        selectedItemColor: Colors.amber[800],
        onTap: _onItemTapped,
      ),
    );
  }
}

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        child: Text('Go page 1'),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => MyApp()),
          );
        },
      ),
    );
  }
}

class PageThree extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        child: Text('Go page 2'),
        onPressed: () {
          scakey.currentState._onItemTapped(1);
          /*Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => PageTwo()),
          );*/
        },
      ),
    );
  }
}
0 голосов
/ 30 октября 2019

Это потому, что ваш виджет PageTwo () не содержит AppBar и BottomNavigationBar. Для этого вам нужно запустить MyStatefulWidget() с выбранным значением _selectedIndex 1.

0 голосов
/ 30 октября 2019

При использовании панели навигации для перемещения между страницами вы нажимаете BottomNavigationBarItem, чтобы изменить индекс, вызывая setState (), и в результате метод сборки запускается с новым _selectedIndex, и этот индекс используется для визуализации вашего соответствующего виджета.

_widgetOptions.elementAt (_selectedIndex)

С другой стороны, Navigator.push просто проталкивает новый маршрут поверх стека навигации. Вы не получаете AppBar или BottomNavigationBar, поскольку у вас их нет на PageTwo. Я бы порекомендовал вам создать функцию обратного вызова в PageTwo и вызывать эту функцию по нажатию кнопки. Теперь вы можете использовать этот обратный вызов в MyStatefulWidget, чтобы изменить индекс с помощью setState. Вот пример

Объявите финал, как показано ниже на ваших страницах.

final void Function(int index) pageChanged;

В событии onTap вашей кнопки вызовите эту функцию.

widget.pageChanged(1); // PageTwo

В MyStatefulWidget при создании страниц передайте функцию.

PageTwo(pageChanged:(index){
  setState(){_selectedIndex = index;}
});
...