简体   繁体   English

如何在 flutter 的抽屉小部件中使用与底部导航栏相同的导航路线?

[英]How can I use same navigation route I used for bottomnavigationbar in drawer widget in flutter?

I already have a bottom navigation bar which navigates to different pages.我已经有一个导航到不同页面的底部导航栏。 then I add a drawer which I want it to change the widget in the body only, but the issue is that I made the drawer in another page and I called it, so it is not responding or I'm not calling it perfectly as I should.然后我添加了一个抽屉,我希望它只更改正文中的小部件,但问题是我在另一个页面中制作了抽屉并调用了它,所以它没有响应或者我没有完美地调用它应该。

Below is the navigation for the bottomnavigationbar, I have imported all necessary files下面是底部导航栏的导航,我已经导入了所有必要的文件

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int currentTab = 0;
  final tabs = [
    IndexPage(),
    Save(),
    Invest(),
    Wallet(),
    Cards(),
  ];

@override
  Widget build(BuildContext context) {
    return MaterialApp(
      color: Colors.grey[900],
      debugShowCheckedModeBanner: false,
      title: 'Flochristos App',
      theme: ThemeData(),
      home: Scaffold(
        backgroundColor: Colors.black,
        resizeToAvoidBottomPadding: false,
        resizeToAvoidBottomInset: false,
        key: _scaffoldKey,
        appBar: AppBar(
          backgroundColor: Colors.grey[900],
          title: Text(
            'PettySave',
            style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
          ),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.brightness_7_outlined),
              onPressed: () {},
            ),
            IconButton(
              icon: Icon(Icons.keyboard_arrow_down_sharp),
              onPressed: () {},
            ),
            IconButton(
              icon: Icon(Icons.account_circle_rounded),
              onPressed: () {},
            ),
          ],
          //shadowColor: Colors.grey,
        ),


        body: tabs[currentTab], //this is where I want to change the pages



        floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
        bottomNavigationBar: BottomNavigationBar(
          onTap: (int index) {
            setState(() {
              currentTab = index;
            });
          },
          currentIndex: currentTab,
          backgroundColor: Colors.grey[900],
          unselectedIconTheme: IconThemeData(color: Colors.grey),
          selectedItemColor: Colors.green,
          unselectedItemColor: Colors.grey,
          type: BottomNavigationBarType.fixed,
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.home_filled),
              // ignore: deprecated_member_use
              title: Text(
                "Home",
              ),
            ),
            BottomNavigationBarItem(
              icon: FaIcon(FontAwesomeIcons.pagelines),
              // ignore: deprecated_member_use
              title: Text(
                "Save",
              ),
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.trending_up),
              // ignore: deprecated_member_use
              title: Text(
                "Invest",
              ),
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.account_balance_wallet_outlined),
              // ignore: deprecated_member_use
              title: Text(
                "Wallet",
              ),
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.credit_card),
              // ignore: deprecated_member_use
              title: Text(
                "Cards",
              ),
            ),
          ],
        ),
      ),
    );
  }
}

}

that's the main.dart code这是主要的。dart代码

body: tabs[currentTab], //this is where I want to change the pages

then I created another page for drawer which I called all appropriate pages然后我为抽屉创建了另一个页面,我称之为所有适当的页面

from one of the list style in the slidedrawer.dart, I'm trying to set currentTab to any index I want.... but it's not working.从 slidedrawer.dart 中的列表样式之一,我正在尝试将 currentTab 设置为我想要的任何索引....但它不起作用。

ListTile(
                  contentPadding: EdgeInsets.fromLTRB(30, 0, 0, 0),
                  leading: Icon(
                    Icons.trending_up,
                    color: Colors.grey[500],
                  ),
                  title: Text(
                    'Investments',
                    style: TextStyle(
                      color: Colors.grey[300],
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                  onTap: () {
                    setState(() {
                      currentTab = 1;
                    });
                  },
                ),

I want the index to turn to Save()我希望索引转向 Save()

List<Widget> tabs = [
    IndexPage(),
    Save(),
    Invest(),
    Wallet(),
    Cards(),
  ];

There are many ways to add a drawer to an app, but the most common one is to use the drawer property thats within the Scaffold() Widget.有很多方法可以将抽屉添加到应用程序,但最常见的一种是使用 Scaffold() 小部件中的抽屉属性。

ex前任

Scaffold(
  appBar: AppBar(
  ...
  ),
  drawer: Drawer() // This is where you call the new Widget(class) that you made the drawer in
  body: tabs[currentTab],
);

This is how I understood your question, correct me if I misunderstood it.这就是我对您的问题的理解,如果我误解了,请纠正我。

This is an example how I used a navigation tab bar in one of my projects.这是我如何在我的一个项目中使用导航选项卡栏的示例。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../../providers/auth.dart';
import '../../../widgets/auth/admin/main_drawer.dart';
import '../../auth/profile_screen.dart';
import '../../home_screen.dart';
import './../projects_screen.dart';

class AdminTabBarScreen extends StatefulWidget {
  static const routeName = 'auth-tab-bar-view';
  @override
  _AdminTabBarScreenState createState() => _AdminTabBarScreenState();
}

class _AdminTabBarScreenState extends State<AdminTabBarScreen>
    with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void initState() {
    _tabController = TabController(length: 3, vsync: this);
    super.initState();
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<Auth>(context);
    return Scaffold(
      // appBar: AppBar(
      //   title: Text('SHTEGU'),
      // ),
      extendBody: true,
      drawer: MainDrawer(), // this is where I called my drawer
      body: Container(
        // color: Colors.blueAccent,
        child: TabBarView(
          children: <Widget>[
            HomeScreen(),
            ProjectsScreen(),
            ProfileScreen(),
            // LoginScreen(),
          ],
          controller: _tabController,
        ),
      ),
      bottomNavigationBar: Container(
        padding: EdgeInsets.all(16.0),
        child: ClipRRect(
          borderRadius: BorderRadius.all(
            Radius.circular(50.0),
          ),
          child: Container(
            color: Colors.black26,
            child: TabBar(
              labelColor: Color(0xFFC41A3B),
              unselectedLabelColor: Colors.white,
              labelStyle: TextStyle(fontSize: 13.0),
              indicator: UnderlineTabIndicator(
                borderSide: BorderSide(color: Colors.black54, width: 0.0),
                insets: EdgeInsets.fromLTRB(50.0, 0.0, 50.0, 40.0),
              ),
              //For Indicator Show and Customization
              indicatorColor: Colors.black54,
              tabs: <Widget>[
                Tab(
                  text: 'Home',
                ),
                Tab(
                  text: 'Projects',
                ),
                Tab(
                  text: 'Profile',
                ),
                // Tab(
                //   text: 'Login',
                // ),
              ],
              controller: _tabController,
            ),
          ),
        ),
      ),
    );
  }
}

Here is how I called the class above to check if admin这是我如何调用上面的 class 来检查管理员是否

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../screens/auth/admin/admin_tab_bar_screen.dart';
import '../../screens/auth/user_tab_bar_screen.dart';
import '../../providers/auth.dart';

class AuthTabBarScreen extends StatelessWidget {
  static const routeName = 'auth-tab-bar-view';
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: Provider.of<Auth>(context, listen: false).isAdmin(),
      builder: (context, snapshot) => snapshot.hasData
          ? snapshot.data
              ? AdminTabBarScreen()
              : UserTabBarScreen()
          : CircularProgressIndicator(), // while you're waiting for the data, show some kind of loading indicator
    );
  }
}

And here is my drawer:这是我的抽屉:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../../screens/auth/admin/register_user_screen.dart';
import '../../../screens/auth/auth_tab_bar_screen.dart';
import '../../../screens/tab_bar_screen.dart';
import '../../../providers/auth.dart';

class MainDrawer extends StatelessWidget {
  Widget buildListTile(
      String title, IconData icon, Function tapHandler, BuildContext ctx) {
    return ListTile(
      tileColor: Color(0xffF2F7FB),
      selectedTileColor: Theme.of(ctx).accentColor,
      leading: Icon(
        icon,
        size: 26,
        color: Theme.of(ctx).primaryColor,
      ),
      title: Text(
        title,
        style: TextStyle(
          fontFamily: 'RobotoCondensed',
          fontSize: 16,
          fontWeight: FontWeight.bold,
          color: Theme.of(ctx).primaryColor,
        ),
      ),
      onTap: tapHandler,
    );
  }

  @override
  Widget build(BuildContext context) {
    final authData = Provider.of<Auth>(context, listen: false);
    return Drawer(
      child: SafeArea(
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              buildListTile(
                'Home',
                Icons.home_rounded,
                () {
                  Navigator.of(context)
                      .pushReplacementNamed(AuthTabBarScreen.routeName);
                },
                context,
              ),
              buildListTile(
                'Add user',
                Icons.person_add_alt_1_rounded,
                () {
                  // Navigator.of(context).pop();
                  Navigator.of(context)
                      .pushReplacementNamed(RegisterUserScreen.routeName);
                },
                context,
              ),
              buildListTile(
                'Sign Out',
                Icons.exit_to_app_rounded,
                () {
                  authData.signOut();
                },
                context,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Hope this is at least of help to you:D希望这至少对您有所帮助:D

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 flutter 中实现此 appbar 设计,其中我将 Navigation 插入 appbar 而不是 bottomNavigationBar - How can I achieve this appbar design in flutter in which I insert Navigation inside appbar rather than bottomNavigationBar 当我使用提供Android Studio的活动抽屉导航模板时,如何使用片段在Drawerlayout上打开项目? - How can I use Fragments to open items on a Drawerlayout, when i used the Activity Drawer Navigation Template that provides android studio? 如何在没有碎片的情况下使用导航抽屉? - How can I use the Navigation Drawer without fragments? 可以在导航抽屉中使用ListFragment? - can I use ListFragment with Navigation Drawer? 我可以在没有ActionBar的情况下使用导航抽屉吗? - Can I use Navigation Drawer without ActionBar 如何展示导航抽屉? - How can I showcase the navigation drawer? 我如何使用导航抽屉来做到这一点? - How I can do this using navigation drawer? 活动可以用于导航抽屉,还是应该坚持使用片段? - Activity can be used for Navigation Drawer or Should I stick to Fragments? 如何使用导航抽屉嵌套碎片? - How can I nest fragments with a navigation drawer? 我如何重构导航抽屉 - How can i refactor the navigation drawer
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM