首页 > 解决方案 > Flutter:当我转到新屏幕并返回时,如何保持我选择的导航器

问题描述

我现在在颤动的底部导航中遇到问题。

我有四个导航“社区、提要、活动、个人资料”。

在我的“Feed”导航中,我有一个名为“View Profile”的按钮,每次单击该按钮时,它都会使用

“Navigator.push(上下文,MaterialPageRoute())”

我注意到它会在应用栏上自动生成一个“<-”或“后退箭头”图标。

问题是每次我单击“后退箭头”时,它都会将我重定向到导航栏上的第一个选项。

不在“Feed”导航中。

任何提示如何解决这个问题?

这是我的底部导航代码:

_getPage(int page) {
switch (page) {
case 0:
  return NewsFeed();
case 1:
  return OrgAndNews();
case 2:
  return MyActivity();
case 3:
  return Profile();
 }
}

int currentPage = 0;

void _onBottomNavBarTab(int index) {
  setState(() {
    currentPage = index;
  });

}


 return Scaffold(
  body: Container(
    child: _getPage(currentPage),
  ),
  bottomNavigationBar: Container(
    height: _height * .09,
    child: BottomNavigationBar(
      backgroundColor: Color(0xFFFFFFFF),
      fixedColor: Color(0xFF121A21),
      unselectedItemColor: Color(0xFF121A21),
      currentIndex: currentPage,
      onTap: _onBottomNavBarTab,
      items: [
        BottomNavigationBarItem(
          icon: Icon(FontAwesomeIcons.users),
          title: Padding(
            padding: const EdgeInsets.only(top: 3.0),
            child: Text('Community', style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(35),
              fontWeight: FontWeight.w800),
            ),
          ),
        ),
        BottomNavigationBarItem(
          icon: Icon(FontAwesomeIcons.newspaper),
          title: Padding(
            padding: const EdgeInsets.only(top: 3.0),
            child: Center(
              child: Text('Feeds', style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(35),
                  fontWeight: FontWeight.w800),),
            ),
          ),
        ),
        BottomNavigationBarItem(
          icon: Icon(FontAwesomeIcons.listUl),
          title: Padding(
            padding: const EdgeInsets.only(top: 3.0),
            child: Text('My Activity', style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(35),
                fontWeight: FontWeight.w800),),
          ),
        ),
        BottomNavigationBarItem(
          icon: Icon(FontAwesomeIcons.userAlt),
          title: Padding(
            padding: const EdgeInsets.only(top: 3.0),
            child: Text('Profile', style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(35),
                fontWeight: FontWeight.w800),),
          ),
        ),
      ],
    ),
  ),
);

当您单击“查看配置文件”时,我的页面代码:

  class OrgProfile extends StatefulWidget {
 OrgProfile(this.orgName) : super();

final String orgName;
  @override
  _OrgProfileState createState() => _OrgProfileState();
 }

 class _OrgProfileState extends State<OrgProfile> {
 @override
 final db = Firestore.instance;

  Container buildItem(DocumentSnapshot doc) {
return Container(
  child: Column(
    children: <Widget>[
      Center(
        child: Padding(
          padding: const EdgeInsets.only(top: 20.0),
          child: CircleAvatar(
            radius: 70,
          ),
        ),
      ),
      Text(
        '${doc.data['Email']}',
        style: TextStyle(color: Colors.black),
      )
    ],
  ),
 );
 }

 Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: Text(widget.orgName),
  ),
  body: StreamBuilder<QuerySnapshot>(
      stream: db
          .collection('USERS')
          .where('Name of Organization', isEqualTo: widget.orgName)
          .snapshots(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Column(
              children: snapshot.data.documents
                  .map((doc) => buildItem(doc))
                  .toList());
        } else {
          return SizedBox();
        }
      }),
   );
  }
 }

当我点击“查看个人资料”按钮时我的代码:

   onPressed: () {
      Navigator.push(
        context,
           MaterialPageRoute(
           builder: (BuildContext context) => new 
      OrgProfile(
         doc.data['Name of Organization'])));
     },

我的提要用户界面:

在此处输入图像描述

我的查看资料用户界面:

在此处输入图像描述

标签: flutterdartflutter-layout

解决方案


你有没有像这样使用带有 Builder 的 MaterialPage Route?

Navigator.push(
                context,
                MaterialPageRoute(
                builder: (BuildContext context) => new MyToDoThunder(),
                    ),
                  )

主页代码:-

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // 
    return new HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  var db = DatabaseHelper();
  int _selectedIndex = 0;
  List<bool> textColorChange = [true, false, false, false];
  final _widgetOptions = [
    StatusPageRedux(),
    RequestPage(),
    NotificationPage(),
    DashboardPage(),
  ];

  _bottomNavigationView() {
    return new Theme(
      isMaterialAppTheme: true,
      data: Theme.of(context)
          .copyWith(canvasColor: Theme.of(context).primaryColor),
      child: new BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        onTap: _onItemTapped,
        currentIndex: _selectedIndex,
        fixedColor: Colors.white,
        items: [
          new BottomNavigationBarItem(
            activeIcon: ThunderSvgIcons(
                path: 'assets/icons/Status.svg', height: 20.0, color: Colors.white),
            icon: ThunderSvgIcons(
                path: 'assets/icons/Status.svg', height: 20.0, color: Colors.white30),
            title: new Text(
              'Status',
              style: TextStyle(
                  color: textColorChange[0] ? Colors.white : Colors.white30),
            ),
          ),
          new BottomNavigationBarItem(
            title: new Text(
              'Requests',
              style: TextStyle(
                  color: textColorChange[1] ? Colors.white : Colors.white30),
            ),
            activeIcon: ThunderSvgIcons(
                path: 'assets/icons/Requests.svg', height: 20.0, color: Colors.white),
            icon: ThunderSvgIcons(
                path: 'assets/icons/Requests.svg',
                height: 20.0,
                color: Colors.white30),
          ),
          new BottomNavigationBarItem(
            activeIcon: ThunderSvgIcons(
                path: 'assets/icons/Notifications.svg',
                height: 20.0,
                color: Colors.white),
            icon: ThunderSvgIcons(
                path: 'assets/icons/Notifications.svg',
                height: 20.0,
                color: Colors.white30),
            title: new Text(
              'Notifications',
              style: TextStyle(
                  color: textColorChange[2] ? Colors.white : Colors.white30),
            ),
          ),
          new BottomNavigationBarItem(
            activeIcon: ThunderSvgIcons(
                path: 'assets/icons/dashboard.svg',
                height: 20.0,
                color: Colors.white),
            icon: ThunderSvgIcons(
                path: 'assets/icons/dashboard.svg',
                height: 20.0,
                color: Colors.white30),
            title: new Text(
              'Dashboard',
              style: TextStyle(
                  color: textColorChange[3] ? Colors.white : Colors.white30),
            ),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {

    return new Scaffold(
      body: new Center(child: _widgetOptions.elementAt(_selectedIndex)),
      bottomNavigationBar: _bottomNavigationView(),
    );
  }

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
      for (int i = 0; i < textColorChange.length; i++) {
        if (index == i) {
          textColorChange[i] = true;
        } else {
          textColorChange[i] = false;
        }
      }
    });
  }
}

推荐阅读