Как реализовать Flutter нижнюю навигацию и ящик? - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок во Флаттере и хочу иметь нижнюю панель навигации для навигации по разным страницам, а также ящик для навигации по разным страницам.

В моей нижней навигации у меня есть 4 иконки меню, Главная (HomePage.dart), Поиск (SearchPage.dart), Канал (ChannelPage.dart) и другие (MorePage.dart)

В моем ящике у меня есть три фрагмента списка 1,2,3, которые ведут на каждую страницу .

Когда у меня есть только нижняя панель навигации, навигация между 4 страницами меню работает нормально, но когда я использую ящик для переноса на другие страницы, я не позволю перейти к фрагменту. страницы с помощью Drawer.

Вот так я получаю доступ к списку ящиков / перемещаюсь по нему

  _getDrawerItemWidget(int pos) {
    switch (pos) {
      case 0:
        return new FirstFragment();
      case 1:
        return new SecondFragment();
      case 2:
        return new ThirdFragment();

      default:
        return new Text("Error");
    }
  }

Вот так я получаю доступ / пользуюсь навигацией по нижнему меню

final List<Widget> _children = [
    HomePage(),
    SettingsPage(),
    ContactPage(),
    HomePage()
  ];

Проблема, с которой я столкнулся, заключается в тело. Я не могу использовать оба одновременно

   body: _children.elementAt(_currentIndex),  // navigate to 4 bottom navigation pages

или

   body: _getDrawerItemWidget(_currentIndex), // navigate to 3 drawer pages

Это полный код, если вы хотите проверить его.

import 'package:flutter/material.dart';
import 'package:testing2/pages/ContactPage.dart';
import 'package:testing2/pages/HomePage.dart';
import 'package:testing2/pages/SettingsPage.dart';
import 'package:testing2/pages/MorePage.dart';
import 'placeholder_widget.dart';
import 'package:testing2/fragments/first_fragment.dart';
import 'package:testing2/fragments/second_fragment.dart';
import 'package:testing2/fragments/third_fragment.dart';

class DrawerItem {
  String title;
  IconData icon;
  DrawerItem(this.title, this.icon);
}

class MyHomePage extends StatefulWidget {
    final drawerItems = [
    new DrawerItem("Fragment 1", Icons.rss_feed),
    new DrawerItem("Fragment 2", Icons.local_pizza),
    new DrawerItem("Fragment 3", Icons.info)
  ];
  @override
  _MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
}

class _MyBottomNavigationBarState extends State<MyHomePage> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  int _currentIndex = 0;

  _getDrawerItemWidget(int pos) {
    switch (pos) {
      case 0:
        return new FirstFragment();
      case 1:
        return new SecondFragment();
      case 2:
        return new ThirdFragment();

      default:
        return new Text("Error");
    }
  }
    _onSelectItem(int index) {
    setState(() => _currentIndex= index);
    Navigator.of(context).pop(); // close the drawer
  }

  final List<Widget> _children = [
    HomePage(),
    SettingsPage(),
    ContactPage(),
    MorePage()
  ];

  void onTappedBar(int index){
    index == 4
    ? _scaffoldKey.currentState.openDrawer()
    : setState((){
      _currentIndex = index;

    });
  }

  @override
  Widget build(BuildContext context) {
     var drawerOptions = <Widget>[];
     for (var i = 0; i < widget.drawerItems.length; i++) {
      var d = widget.drawerItems[i];
      drawerOptions.add(
        new ListTile(
          leading: new Icon(d.icon),
          title: new Text(d.title),
          selected: i == _currentIndex,
          onTap: () => _onSelectItem(i),
        )
      );
    }
    return new Scaffold(
      body: _children[_currentIndex],
      drawer: new Drawer(
                child: new Column(
          children: <Widget>[
            new UserAccountsDrawerHeader(
                accountName: new Text("John Doe"), accountEmail: null),
            new Column(children: drawerOptions)
          ],
        ),
      ),
      appBar: new AppBar(
        leading: new Container(),
        actions: <Widget>[
        IconButton(
          icon: Icon(
            Icons.dashboard,
            color: Colors.white,
          ),
          onPressed: (){

          },
        )],
        title: Text('Maxis Mobile')),
      bottomNavigationBar: BottomNavigationBar(
        backgroundColor: Colors.blueGrey,

        type: BottomNavigationBarType.fixed,
        onTap: onTappedBar,
        currentIndex: _currentIndex,
        items: <BottomNavigationBarItem> [
          BottomNavigationBarItem(icon: new Icon(Icons.home, color: Color.fromARGB(255, 255, 255, 255)), title: new Text('Home', style: TextStyle(color: Colors.white),), ),
          BottomNavigationBarItem(icon: new Icon(Icons.search), title: new Text('Explore')),
          BottomNavigationBarItem(icon: new Icon(Icons.device_hub), title: new Text('Channels')),
          BottomNavigationBarItem(icon: new Icon(Icons.dehaze), title: new Text('More')),

        ],

      ),

    );
  }
}
class Page extends StatelessWidget {
  const Page({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
...