【问题标题】:How can I use same navigation route I used for bottomnavigationbar in drawer widget in flutter?如何在颤动的抽屉小部件中使用与底部导航栏相同的导航路线?
【发布时间】:2021-05-20 17:06:21
【问题描述】:

我已经有一个底部导航栏,可以导航到不同的页面。 然后我添加了一个抽屉,我希望它只更改正文中的小部件,但问题是我在另一个页面中制作了抽屉并调用了它,所以它没有响应或者我没有完美地调用它应该。

下面是底部导航栏的导航,我已经导入了所有必要的文件

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",
              ),
            ),
          ],
        ),
      ),
    );
  }
}

}

这是 main.dart 代码

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

然后我为抽屉创建了另一个页面,我称之为所有适当的页面

从 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;
                    });
                  },
                ),

我希望索引转到 Save()

【问题讨论】:

    标签: android flutter dart


    【解决方案1】:
    List<Widget> tabs = [
        IndexPage(),
        Save(),
        Invest(),
        Wallet(),
        Cards(),
      ];
    

    【讨论】:

    • 我已经有了这个,发生的事情是我在另一个页面的一个类中有这个抽屉,但它并没有改变 main.dart 部分中 body 的标签
    • 尝试使用 BottomNavigationBar 而不是 BottomNavigationBarType.fixed
    • 代码转储不能提供好的答案。你应该解释如何为什么这可以解决他们的问题。我推荐阅读,“How do I write a good answer?"
    【解决方案2】:

    有很多方法可以将抽屉添加到应用程序,但最常见的一种是使用 Scaffold() 小部件中的抽屉属性。

    例如

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

    我是这样理解你的问题的,如果我误解了,请纠正我。

    这是我如何在我的一个项目中使用导航标签栏的示例。

    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,
                ),
              ),
            ),
          ),
        );
      }
    }
    

    这是我如何调用上面的类来检查是否是管理员

    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
        );
      }
    }
    

    这是我的抽屉:

    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,
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    希望这至少对您有所帮助:D

    【讨论】:

    • 这个有点复杂,我刚开始flutter\
    • 我明白了,那么我建议您观看此视频,因为它将帮助您更好地理解我的回答:youtube.com/watch?v=qDJv5u5Ia9c
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多