【问题标题】:How do I switch to the another Tab Screen?如何切换到另一个选项卡屏幕?
【发布时间】:2020-04-18 03:09:41
【问题描述】:

当我点击标签栏上的另一个图标但它不起作用时,我想切换到另一个屏幕。我总是在 HomeScreen() 中,无法切换到 HomeScreenMapView()。我想我在ListView.builder 的退货时遇到了问题,但我不知道如何继续。

我的代码:

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import '../screens/home_screen.dart';
import '../screens/home_screen_map_view.dart';

class TabBarTop extends StatefulWidget {
  @override
  _TabBarTopState createState() => _TabBarTopState();
}

class _TabBarTopState extends State<TabBarTop> with SingleTickerProviderStateMixin {
  bool _isAppbar = true;
      ScrollController _scrollController = new ScrollController();

      @override
      void initState() {
        super.initState();
        _scrollController.addListener(() {
          if (_scrollController.position.userScrollDirection ==
              ScrollDirection.reverse) {
            appBarStatus(false);
          }
          if (_scrollController.position.userScrollDirection ==
              ScrollDirection.forward) {
            appBarStatus(true);
          }
        });
      }

      void appBarStatus(bool status) {
        setState(() {
          _isAppbar = status;
        });
      }

      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: Scaffold(
            appBar: PreferredSize(
              preferredSize: Size.fromHeight(MediaQuery.of(context).size.height * 0.12),
              child: AnimatedContainer(
                height: _isAppbar ? MediaQuery.of(context).size.height * 1 : 0.0,
                duration: Duration(milliseconds: 200),
                child: CustomAppBar(),
              ),
            ),
            body: ListView.builder(
              controller: _scrollController,
              itemCount: 100,
              itemBuilder: (BuildContext context, int index) {
                return HomeScreen();
              },
            ),
          ),
        );
      }
    }

    class CustomAppBar extends StatefulWidget {
      @override
      AppBarView createState() => new AppBarView();
    }

    class AppBarView extends State<CustomAppBar> {
      @override
      Widget build(BuildContext context) {
        return DefaultTabController(
      length: 2,
      child: NestedScrollView(
        headerSliverBuilder: (context, value) {
          return [
            SliverAppBar(
              title: Center(
                heightFactor: 0,
                child: Padding(
                  padding: const EdgeInsets.only(top: 7),
                  child: Image.asset(
                    'assets/images/***.png',
                    fit: BoxFit.cover,
                    scale: MediaQuery.of(context).size.width * 0.007,
                    alignment: Alignment.bottomCenter,
                  ),
                ),
              ),
              expandedHeight: MediaQuery.of(context).size.height * 0.12,
              primary: true,
              floating: true,
              pinned: true,
              bottom: TabBar(
                indicatorColor: Color.fromRGBO(253, 166, 41, 1.0),
                tabs: <Widget>[
                  Tab(
                    icon: Icon(Icons.list),
                  ),
                  Tab(
                    icon: Icon(Icons.location_on),
                  ),
                ],
              ),
              forceElevated: false,
              flexibleSpace: Container(
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    begin: Alignment.topCenter,
                    end: Alignment.bottomCenter,
                    colors: <Color>[
                      Color.fromRGBO(107, 176, 62, 1.0),
                      Color.fromRGBO(153, 199, 58, 1.0),
                    ],
                  ),
                ),
              ),
            )
          ];
        },
        body: TabBarView(
          children: <Widget>[
            HomeScreen(),
            HomeScreenMapView(),
          ],
        ),
      ),
    );
      }
    }

谢谢:)

【问题讨论】:

  • 你能解释一下你所期望的行为吗?我的意思是你在这个屏幕上想要的整体。
  • 我想切换到 HomeScreenMapView(),当我点击标签栏上的位置图标时,但当我点击两个图标时,我总是看到 HomeScreen()。 @VirenVVarasadiya
  • 这很明显,但我无法理解您是否要基于选项卡构建列表。例如,如果选择了第一个选项卡,则使用 HomeScreen 列出并使用 HomeScreenMapView 在第二个选项卡列表中列出?
  • @VirenVVarasadiya 是的,第一个选项卡 HomeScreen() = ListView.builder 屏幕,第二个选项卡应该是 Google 地图屏幕(HomeScreenMapView()。

标签: flutter switch-statement tabbar


【解决方案1】:

我认为您不需要 TabBarTop 类来实现这一点,您只能使用提供该功能的 CustomAppBar 类。

我不知道我目前对您的问题和需求了解多少,但我正在回答它。

希望以下代码对您有所帮助。

直接从你的 main 调用 TabBarTop。

   class TabBarTop extends StatefulWidget {
  @override
  _TabBarTopState createState() => _TabBarTopState();
}

class _TabBarTopState extends State<TabBarTop>
    with SingleTickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: DefaultTabController(
          length: 2,
          child: NestedScrollView(
            headerSliverBuilder:
                (BuildContext context, bool innerBoxIsScrolled) {
              return <Widget>[
                SliverAppBar(
                  expandedHeight: 50.0,
                  floating: true,
                  snap: true,
                  flexibleSpace: FlexibleSpaceBar(
                      centerTitle: true,
                      title: Text("Collapsing Toolbar",
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 16.0,
                          )),
                      background: Image.network(
                        "https://images.pexels.com/photos/396547/pexels-photo-396547.jpeg?auto=compress&cs=tinysrgb&h=350",
                        fit: BoxFit.cover,
                      )),
                ),
                SliverPersistentHeader(
                  delegate: _SliverAppBarDelegate(
                    TabBar(
                      labelColor: Colors.black87,
                      unselectedLabelColor: Colors.grey,
                      tabs: [
                        Tab(icon: Icon(Icons.info), text: "Tab 1"),
                        Tab(icon: Icon(Icons.lightbulb_outline), text: "Tab 2"),
                      ],
                    ),
                  ),
                  pinned: true,
                ),
              ];
            },
            body: TabBarView(
              children: <Widget>[
                HomeScreen(),
                Container(
                  child: Center(child: Text("cds2")),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: ListView.builder(
        itemExtent: 150,
        itemCount: 10,
        itemBuilder: (_, index) {
          return Text("csca $index");
        },
      ),
    );
  }
}

class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
  _SliverAppBarDelegate(this._tabBar);

  final TabBar _tabBar;

  @override
  double get minExtent => _tabBar.preferredSize.height;
  @override
  double get maxExtent => _tabBar.preferredSize.height;

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return new Container(
      color: Colors.white,
      child: _tabBar,
    );
  }

  @override
  bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {
    return false;
  }
}

【讨论】:

  • 但是如果我执行这个我的动画就会丢失。我希望这种情况持续下去。当我向下滚动时,应用程序和标签栏消失,当我向上滚动时,应用程序栏和标签栏重新出现在 HomeScreen() 中。
  • 首先,感谢您的帮助,但只有当我位于 listview.builder 的顶部时,应用程序和标签栏才会重新出现。但是当我向上或向下滚动时,我希望应用程序和标签栏可见或不可见。你知道我的意思?对这种情况感到抱歉。
  • 你可以试一试。我改变了代码。看一下这个。 woolha.com/tutorials/flutter-sliverappbar-examples
  • 工具栏按其应有的工作方式工作,但如果我向上或向下滚动,则选项卡栏在工具栏上不可见。它只是在列表顶部可见。感谢网站 :) 更新:我找到了解决方案!
  • 很高兴听到您找到了解决方案。你能编辑我的答案吗,因为我的模拟器很慢,所以很难找到改变。如果有用,请接受我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多