- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
flutter 底部导航栏的最佳方法是什么?
根据Getting to the Bottom of Navigation in Flutter的介绍,当用户更改选项卡时,flutter团队使用IndexedStack
和Offstage
来显示小部件,但是我看到了另一种方法,即TabBarView
通过简单的幻灯片动画在小部件之间进行切换,并保持每个小部件的滚动状态
那么IndexedStack
+ Offstage
和TabBarView
有什么区别?更改当前选项卡的最佳方法是我应该使用flutter_bloc
之类的东西还是仅使用setState()
?
最佳答案
概述
好吧,有很多方法可以在Flutter中实现BottomNavigationBar
。
但是,使用IndexedStack
方法将在开始时创建BottomNavigationBar
的所有屏幕。可以使用TabBarView
修复此问题。
这是我使用BottomNavigationBar
和CupertinoTabBar
在我的应用程序中实现PageView
的方式,因为它一开始只会显示一个屏幕。并且也使用AutomaticKeepAliveMixin
,因为它不会让屏幕再次被创建。
关键点
PageView
一起使用PageController
,通过它您可以轻松地在屏幕之间切换。 AutomaticKeepAliveClientMixin
不允许重新创建屏幕,因此无需使用IndexedStack
。 Provider
时,使用Consumer
和CupertinoTabBar
仅重新创建currentIndex
。而不是使用setState()
,因为它将重新创建整个屏幕,让所有小部件都可以重新构建。但是这里是使用Provider
仅重新创建TabBar
。 HomePage (
BottomNavigtionBar
)
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
PageController _pageController;
@override
void initState() {
_pageController = PageController();
super.initState();
}
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
// Wrapping the CupertinoTabBar in Consumer so that It only get
// recreated.
bottomNavigationBar: Consumer<HomeVM>(
builder: (context, model, child) {
return CupertinoTabBar(
backgroundColor: Colors.white10,
currentIndex: model.currentPage,
onTap: (index) {
index == model.currentPage
? print('same screen')
: _pageController.jumpToPage(
index,
);
model.changePage(index);
},
items: bottomNavItems);
},
),
body:ChangeNotifierProvider(
create: (_) => locator<HelpVM>(),
child: SafeArea(
top: false,
child: PageView(
controller: _pageController,
physics: NeverScrollableScrollPhysics(),
children: <Widget>[
FrontScreen(),
WorkRootScreen(),
HelpScreen(),
AccountScreen(),
],
),
),
),
);
}
const List<BottomNavigationBarItem> bottomNavItems =
<BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: const Icon(
FontAwesomeIcons.home,
),
),
//...... bottomNavigationBarItems
];
}
HomeVM (Using
Provider
to change the index and recreate onlyTabBar
usingConsumer
)
class HomeVM extends ChangeNotifier {
int _currentPage = 0;
int get currentPage => _currentPage;
void changePage(int index) {
this._currentPage = index;
notifyListeners();
}
}
FrontScreen (Here we are using
AutomaticKeepAliveClientMixin
to retain the state by not recreating the Widget)
class FrontScreen extends StatefulWidget {
@override
_FrontScreenState createState() => _FrontScreenState();
}
class _FrontScreenState extends State<FrontScreen>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
// VIMP to Add this Line.
super.build(context);
return SafeArea(
// Your Screen Code
);
}
@override
bool get wantKeepAlive => true;
}
关于flutter - TabBarView或BottomNavigationBar的IndexedStack-Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61414778/
我有以下正常工作的代码: import 'package:flutter/material.dart'; import 'screen_curiosities.dart'; import 'scree
我在我的应用程序中集成了底部栏导航栏。但是当我滑动时,选项卡的颜色不会改变。这很奇怪,因为我有选择器文件。有解决这个问题的想法吗? Activity.java BottomNavigationView
我想在 BottomNavigationBar 的元素被点击后的一段时间内禁用与它的交互。 我尝试使用 AbsorbPointer 来做到这一点: int _bottomBarIndex = 0;
我正在构建一个在底部导航栏中包含 3 个项目的应用。当我更改选项卡时,会呈现一个不同的小部件。到目前为止,还不错... import 'package:flutter/material.dart';
是的,我的问题是这个。我该怎么做? 我做了一个 BottomNavigationBar,但它看起来像这样。 我的代码是这样的: bottomNavigationBar: BottomNavigatio
我试图弄清楚如何在 BottomNavigationBar 的顶部添加一条非常微妙的黑线,使其开始与其余内容更加不同。 AirBnb 就是一个很好的例子。 有没有办法用 Flutter 实现这一点?
我有一个带有 BottomNavigationBar 的 Android 应用程序,横向模式下有四个菜单项。这些项目像这样在中间聚集在一起: 我想让它们像这样均匀地分布在导航栏上: 如何完成这种格式化
在我的应用程序中,我创建了一个带有 LinearLayout 的自定义 bottomNavigationView。 但我遇到了一个问题,当虚拟键盘出现时,我的自定义 navigationView 并没
我正在使用来自 here 的 BottomNavigationBar .我仔细按照每条说明进行操作,它工作正常,直到我遇到这个问题,即图标从屏幕上弹出,并且它们之间的间隙太大。 Menu_items.
目标: 1) 使状态栏透明 - 完成 2) 使BottomNavigationView 和Navbar 颜色相同。 - 几乎完成 问题 通过在我的 Activity 中添加以下代码,状态栏变得透明。但
我在 flutter 上工作,我制作了一个有 5 个标签的应用程序,使用 BottomNavigationBar,它改变了当前显示的内容。当我点击一个选项卡时,内容会更新为新内容,但选项卡图标不会改变
我在我的 flutter 应用程序中使用 BottomNavigationBar。这是存在 View : 但我需要在项目之间添加分隔符。像这样: 这可能吗?有没有简单的方法来实现这个? 最佳答案 可以
我们可以使用 AppBar 小部件添加标题。 class HomePage extends StatelessWidget { @override Widget build(BuildCont
我正在制作一个带有标签栏的简单应用。我需要将底部导航栏的背景颜色更改为蓝色。应用程序的其余部分应为白色背景,导航栏应为蓝色背景。我该怎么做?在 ThemeData 中设置 canvasColor 无效
我用了bmnav到底部导航栏的实现。这是我的实现。 主.dart class MainWidgetState extends State { @override void initState
我无法让顶部 TabBar 在我的 BottomNavigationBar 中呈现。我只希望顶部 TabBar 显示在首页 BottomNavigationBarItem 内。我知道我可以在主页中设置
我正在用 flutter 创建我的第一个应用,但我遇到了状态管理方面的问题。我有一个带有 BottomNavigationBar 和 body: 带有 tabPages[MainTab, ...] 的
我将 BottomNavigationBar 与 TabController 一起使用。通过单击 BottomNavigationBar 的不同选项卡,TabView 正在更改内容。但是,如果我在 T
我们如何禁用连接到脚手架的 BottomNavigationBar 上的滑动? 我在官方文档中找不到这样做的方法。 最佳答案 明白了: 就用 physics: const NeverScrollabl
我正在尝试更改 BottomNavigation 图标的选定颜色,但我似乎要实现的只是更改文本颜色。请协助: 目前,选中时文本颜色变为黄色,但图标保持白色,我也希望它是黄色的,并且我尝试将非事件图标的
我是一名优秀的程序员,十分优秀!