Flutter 如何使用底部导航器&x27;OnTap&x27;飘飘然

Flutter 如何使用底部导航器&x27;OnTap&x27;飘飘然,flutter,flutter-layout,Flutter,Flutter Layout,我有一个应用程序,其中我有一个列表(例如新闻)。在底部工具栏中,我有一个“上一条”和“下一条”按钮。我想做的是,如果我在**第三条新闻上,单击“上一条”按钮,它将进入第二条新闻。**我已经制作了工具栏,并将在下面附加代码。为了更好地理解,我添加了完整的代码。谢谢 class Newsdetail extends StatefulWidget { String value_image, value_description, value_title; int index; Newsd

我有一个应用程序,其中我有一个列表(例如新闻)。在底部工具栏中,我有一个“上一条”和“下一条”按钮。我想做的是,如果我在**第三条新闻上,单击“上一条”按钮,它将进入第二条新闻。**我已经制作了工具栏,并将在下面附加代码。为了更好地理解,我添加了完整的代码。谢谢

class Newsdetail extends StatefulWidget {
 String  value_image, value_description, value_title;
  int index;


  Newsdetail(
      {Key key,
      @required this.value_image,
      this.value_description,
      this.value_title,
      this.index})
      : super(key: key);

  @override
  _newsdetail createState() => _newsdetail();
}

class _newsdetail extends State<Newsdetail> {
  int _currentindex=0;
  _newsdetail();
  var tabs =[];

    loadyourNews() async {


setState(() {

  tabs = [
  Container(
    child: SingleChildScrollView(
      scrollDirection: Axis.vertical,
      child: Column(
        children: <Widget>[
          Padding(padding: const EdgeInsets.fromLTRB(5.0, 5.0, 5.0, 10.0),
            child: Row(
              children: <Widget>[
                Expanded(child:
                Image.network(widget.value_image))
              ],
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: <Widget>[
                Expanded(
                  child: Row(
                    children: <Widget>[
                      IconButton(
                          icon: Image.asset('images/facebook.png',),
                          padding: EdgeInsets.all(0.0),
                          onPressed: () {
                            _openFacebook();
                          }),
                      IconButton(
                        icon: Image.asset('images/twitter.png',),
                        padding: EdgeInsets.all(0.0),
                        onPressed: () {
                          _openTwitter();
                        },
                      ),
                      IconButton(
                        icon: Image.asset(
                          'images/whatsappicon.png', width: 180.0,
                          height: 180.0,),
                        padding: EdgeInsets.all(4.0),
                        onPressed: () {
                          _openWhatsapp();
                        },
                      )
                    ],
                  ),
                ),
              ],
            ),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(15.0, 5.0, 10.0, 10.0),
            child: Row(
              children: <Widget>[
                Expanded(
                  child: Text(
                    widget.value_title,
                    style: TextStyle(
                        fontSize: 22.0, fontWeight: FontWeight.bold),
                  ),
                ),


              ],
            ),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(15.0, 5.0, 10.0, 10.0),
            child: Row(
              children: <Widget>[
                Expanded(
                    child: Text(
                      widget.value_description,
                      style: TextStyle(fontSize: 20.0),
                    )),
              ],
            ),
          ),
        ],
      ),
    ),
  )
];
});

  }

  @override
  void initState() {
    super.initState();
    loadyourNews();
  }
@override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text(''),
        backgroundColor: Color(0xFF125688),
        actions: <Widget>[
          Padding(
            padding: const EdgeInsets.fromLTRB(0,0,5.0,0),
            child: SizedBox(
                width: 30,
                child: FlatButton(
                    padding: EdgeInsets.all(0),
                    onPressed: (){},
                    child: Text('A+',style: TextStyle(
                        fontSize: 22.0,color: Colors.white
                    ),))),
          ),

          Padding(
            padding: EdgeInsets.fromLTRB(0,0,38.0,0),
            child: SizedBox(
                width: 30,
                child:FlatButton(
                  padding: EdgeInsets.all(0),
                  onPressed: (){},
                  child: Text('A-',style: TextStyle(
                      fontSize: 15.0,color: Colors.white
                  ),),

                )),
          )

        ],
      ),
      body: tabs[_currentindex],

      bottomNavigationBar:BottomNavigationBar(
        currentIndex: _currentindex,
        backgroundColor: Color(0xFF125688),
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.arrow_back),
            title: Text('Previous',style: TextStyle(
                color: Colors.white
            ),),
            backgroundColor: Colors.white,

          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.arrow_forward),
            title: Text('Next',style: TextStyle(
                color: Colors.white
            ),),
            backgroundColor: Colors.white,

          ),
        ],
        onTap: (index){
          setState(() {
            if (index == 0) {
              _currentindex = (_currentindex - 1) % tabs.length;
              if (_currentindex < 0) _currentindex += _currentindex;
            } else
              _currentindex = (_currentindex + 1) % tabs.length;
          });

        },
      ),

    );
  }
class Newsdetail扩展了StatefulWidget{
字符串值\图像、值\描述、值\标题;
整数指数;
新闻详情(
{键,
@需要此.value\u图像,
这是你的描述,
这个.value_标题,
此文件(索引})
:super(key:key);
@凌驾
_newsdetail createState()=>\u newsdetail();
}
类newsdetail扩展了状态{
int _currentindex=0;
_newsdetail();
var标签=[];
loadyourNews()异步{
设置状态(){
制表符=[
容器(
子:SingleChildScrollView(
滚动方向:轴垂直,
子:列(
儿童:[
填充(填充:LTRB(5.0,5.0,5.0,10.0)中的常量边集),
孩子:排(
儿童:[
扩展(儿童:
Image.network(widget.value\u Image))
],
),
),
填充物(
填充:常数边集全部(8.0),
孩子:排(
儿童:[
扩大(
孩子:排(
儿童:[
图标按钮(
图标:Image.asset('images/facebook.png',),
填充:所有边缘设置(0.0),
已按下:(){
_openFacebook();
}),
图标按钮(
图标:Image.asset('images/twitter.png',),
填充:所有边缘设置(0.0),
已按下:(){
_openTwitter();
},
),
图标按钮(
图标:Image.asset(
'images/whatsappicon.png',宽度:180.0,
高度:180.0,),,
填充:所有边缘设置(4.0),
已按下:(){
_openWhatsapp();
},
)
],
),
),
],
),
),
填充物(
填充:LTRB(15.0,5.0,10.0,10.0)中的常数边集,
孩子:排(
儿童:[
扩大(
子:文本(
widget.value\u标题,
样式:TextStyle(
fontSize:22.0,fontWeight:fontWeight.bold),
),
),
],
),
),
填充物(
填充:LTRB(15.0,5.0,10.0,10.0)中的常数边集,
孩子:排(
儿童:[
扩大(
子:文本(
widget.value\u说明,
样式:TextStyle(fontSize:20.0),
)),
],
),
),
],
),
),
)
];
});
}
@凌驾
void initState(){
super.initState();
加载您的新闻();
}
@凌驾
小部件构建(构建上下文){
//TODO:实现构建
返回脚手架(
appBar:appBar(
标题:文本(“”),
背景颜色:颜色(0xFF125688),
行动:[
填充物(
填充:LTRB(0,0,5.0,0)中的常数边集,
孩子:大小盒子(
宽度:30,
孩子:扁平按钮(
填充:边缘集。全部(0),
按下:(){},
子项:Text('A+',样式:TextStyle(
字体大小:22.0,颜色:Colors.white
),))),
),
填充物(
填充:来自LTRB(0,0,38.0,0)的边缘设置,
孩子:大小盒子(
宽度:30,
孩子:扁平按钮(
填充:边缘集。全部(0),
按下:(){},
子项:Text('A-',样式:TextStyle(
字体大小:15.0,颜色:Colors.white
),),
)),
)
],
),
正文:制表符[_currentindex],
底部导航栏:底部导航栏(
currentIndex:_currentIndex,
背景颜色:颜色(0xFF125688),
项目:[
底部导航气压计(
图标:图标(图标。箭头返回),
标题:文本(“上一页”),样式:TextStyle(
颜色:颜色。白色
),),
背景颜色:Colors.white,
),
底部导航气压计(
图标:图标(图标。向前箭头),
标题:文本(“下一个”,样式:TextStyle)(
颜色:颜色。白色
),),
背景颜色:Colors.white,
),
],
onTap:(索引){
设置状态(){
如果(索引==0){
_currentindex=(_currentindex-1)%tabs.length;
如果(_currentindex<0)_currentindex+=_currentindex;
}否则
_currentindex=(_currentindex+1)%tabs.length;
});
},
),
);
}

分别使用Navigator.push和Navigator.pop作为“下一步”和“上一步”按钮。

下面是一个示例,说明如何使用
页面视图

class PageViewScaffoldIssue extends StatefulWidget {
  @override
  _PageViewScaffoldIssueState createState() => _PageViewScaffoldIssueState();
}

class _PageViewScaffoldIssueState extends State<PageViewScaffoldIssue> {
  PageController _pageController = PageController();
  List<String> _stringList = [
    'Page 1',
    'Page 2',
    'Page 3',
  ];

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: PageView(
            controller: _pageController,
            children: _stringList.map((item) => NewsArticle(article: item,)).toList(),
          ),
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            RaisedButton.icon(
              onPressed: () => _pageController.previousPage(duration: Duration(milliseconds: 400), curve: Curves.easeInOut),
              icon: Icon(Icons.arrow_back),
              label: Text('Previous'),
            ),
            RaisedButton.icon(
              onPressed: () => addArticle(),
              icon: Icon(Icons.add),
              label: Text('Add'),
            ),
            RaisedButton.icon(
              onPressed: () => _pageController.nextPage(duration: Duration(milliseconds: 400), curve: Curves.easeInOut),
              icon: Icon(Icons.arrow_forward),
              label: Text('Next'),
            ),
          ],
        )
      ],
    );
  }

  void addArticle(){
    setState(() {
      _stringList.add('Page ${_stringList.length+1}');
    });
  }
}

class NewsArticle extends StatelessWidget {
  final String article;

  NewsArticle({
    @required this.article,
  });

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(this.article),
    );
  }
}
class PageViewScaffoldIssue扩展StatefulWidget{
@凌驾
_PageViewScaffoldSussetate createState()=>\u PageViewScaffoldSussetate();
}
类_页面视图脚手架状态扩展{
PageController_PageController=PageController();
列表_stringList=[
“第1页”,
“第2页”,
“第3页”,
];
@凌驾
小装置