【问题标题】:MaterialPageRoute goes to a new page without the appbar using it with bottomNavigationBarMaterialPageRoute 转到一个没有应用程序栏的新页面,将其与 bottomNavigationBar 一起使用
【发布时间】:2019-10-30 06:24:25
【问题描述】:

我有一个包含三个路线的应用程序,并使用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()),
          );
        },
      ),
    );
  }
}

当我按下第三页上的按钮时,它将转到没有 AppBar 和 BottomNavigationBar 的第二页

【问题讨论】:

    标签: flutter materialpageroute


    【解决方案1】:

    使用 GlobalKey 和在 PageTwo Widget 调用 MyStatefulWidgetState 的 _onItemTapped 函数
    您可以在下面看到工作演示和完整代码
    代码 sn -p

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

    完整代码

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

    【讨论】:

    • 感谢您的回答,我将如何使用这种方法传递数据。我使用了MaterialPageRoute,所以我可以将数据传递到下一页。
    【解决方案2】:

    当使用导航栏在页面之间导航时,您正在点击 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;}
    });
    

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 2019-05-24
      • 2021-11-19
      • 2018-03-24
      • 2018-05-28
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多