如何根据在颤动中单击哪个导航栏按钮来更改脚手架主体?

Asm*_*oun 2 dart flutter flutter-layout flutter-scaffold

我是 flutter 的新手,我想以正确的方式进行此操作,问题是我有一个底部导航栏包 i Curved_navigation_bar它具有很棒的外观和动画,此导航栏应该更改 Scaffold 小部件的主体并每次显示一个新的小部件取决于单击的按钮,我想要实现的是每次单击导航栏的按钮时执行以下操作:

  • 清除身体的Scaffold
  • 加载相关的小部件

我希望这是在 flutter 中遵循的正确导航方法(更改屏幕或视图),如果这是错误的,请告诉我

    class _SituationState extends State<ScreenSituation>{
         int _page = 0;
         GlobalKey _bottomNavigationKey = GlobalKey();
         @override
    Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        //if list button is clicked preveiw widget_client
        //if people button is clicked preveiw widget_people
        //if launch button is clicked preveiw launch
      ),
      bottomNavigationBar: CurvedNavigationBar(
        key: _bottomNavigationKey,
        index: 0,
        height: 75.0,
        items: <Widget>[
          Icon(Icons.list, size: 30),
          Icon(Icons.people, size: 30),
          Icon(Icons.launch, size: 30),
        ],
        color: Colors.white,
        buttonBackgroundColor: Colors.white,
        backgroundColor: Colors.blueAccent,
        animationCurve: Curves.easeInOut,
        animationDuration: Duration(milliseconds: 300),
        onTap: (index) {
          setState(() {
            _page = index;
          });
        },
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Cla*_*tro 5

获取您的代码示例。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _page = 0;
  GlobalKey _bottomNavigationKey = GlobalKey();

  Widget bodyFunction() {
    switch (_page) {
      case 0:
        return Container(color: Colors.red);
        break;
      case 1:
        return Container(color: Colors.blue);
        break;
      case 2:
        return Container(color: Colors.orange);
        break;
      default:
        return Container(color: Colors.white);
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: bodyFunction(),
      bottomNavigationBar: CurvedNavigationBar(
        key: _bottomNavigationKey,
        index: 0,
        height: 75.0,
        items: <Widget>[
          Icon(Icons.list, size: 30),
          Icon(Icons.people, size: 30),
          Icon(Icons.launch, size: 30),
        ],
        color: Colors.white,
        buttonBackgroundColor: Colors.white,
        backgroundColor: Colors.blueAccent,
        animationCurve: Curves.easeInOut,
        animationDuration: Duration(milliseconds: 300),
        onTap: (index) {
          setState(() {
            _page = index;
          });
        },
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 最好为每个主体创建类并将它们单独放置在文件中,以避免在一个文件中包含太多内容。您还可以使用类创建一个数组,这样就不需要使用 switch case (2认同)