TabBarView 在 Column 中 报错

原因

TabBarView组件占用父组件尽可能大的空间,这种布局一般外层都是可滚动的,类似SingleChildScrollView,而在Column中没有一个明确的高度约束,也就是说无限高,故报错。

解决方法

1. 定高

直接了当地解决问题,但是有一个很大的缺点,TabBarView加载的组件可能是不同高度的,故预定的高度要取他们的最大高度,布局不好看。

SingleChildScrollView(
  child: Column(
    children: [
      MyTabBar(),
     SizedBox(
     	height: 500,
    	child: TabBarView(
    		children:[
  				MyTabView1(),
  				MyTabView2(),
    		],
    	),
     ),
    ],
  ),
)
2. 不使用TabBarView组件

使用IndexedStack组件代替,这种方式是比较推荐的。缺点是缺少原本TabBarView组件的滑动动画,但是可以搭配AnimatedSwitcher组件自定义实现。点击了解更多

SingleChildScrollView(
  child: Column(
    children: [
      MyTabBar(),
      IndexedStack(
      	index: currentIndex, //currentIndex是我举例的值,实际中可能来自TabController,或者Provider等
      	children:[
      		MyTabView1(),
  			MyTabView2(),
      	],
      ),
     ),
    ],
  ),
)
3. 未完待续

总结

flutter布局原理不清楚。
在flutter开发中会遇到很多奇奇怪怪的问题,连百度也不好找。推荐大家使用Google搜索,很多问题都会找到满意的解决方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在指定的TabBarView页面显示FloatingActionButton,可以将FloatingActionButton放置在Scaffold组件的bottomNavigationBar属性,在TabBarView组件的子页面,可以通过Scaffold.of(context)来获取父级Scaffold组件,然后使用ScaffoldState.showSnackBar或者ScaffoldState.showBottomSheet方法来显示SnackBar或BottomSheet。 以下是示例代码: ```dart class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin { final List<Tab> tabs = [ Tab(text: "Tab 1"), Tab(text: "Tab 2"), Tab(text: "Tab 3"), ]; TabController _tabController; @override void initState() { super.initState(); _tabController = TabController(length: tabs.length, vsync: this); } @override void dispose() { _tabController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("My App"), bottom: TabBar( controller: _tabController, tabs: tabs, ), ), bottomNavigationBar: FloatingActionButton( onPressed: () { Scaffold.of(context).showSnackBar(SnackBar( content: Text("Button Pressed"), )); }, child: Icon(Icons.add), ), body: TabBarView( controller: _tabController, children: <Widget>[ Center(child: Text("Tab 1")), Center(child: Text("Tab 2")), Center(child: Text("Tab 3")), ], ), ); } } ``` 在此示例,我们将FloatingActionButton放置在Scaffold的bottomNavigationBar属性,并在其onPressed回调显示一个SnackBar。在TabBarView的子页面,我们可以使用Scaffold.of(context)来获取父级Scaffold组件,并在需要时显示SnackBar或BottomSheet。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值