Исключение говорит: "Неудачное утверждение: строка 1687 поз. 12: 'hasSize". Я думаю, что это случилось, почему TabBarView нужен постоянный размер, я предлагаю вам оборачивать тегом контейнера с фиксированной высотой, а не расширением. Извините за мой английский sh.
Этот тип исключения возникает при сбое какого-либо метода assert, поэтому, думаю, было бы полезно понять исключение: https://www.w3adda.com/dart-tutorial/dart-assert-statement
Я предлагаю вам изменить код для чего-то вроде этого:
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
initialIndex: 0,
child: Padding(
padding: kPaddingTabBar,
child: Column(
children: <Widget>[
Container(
padding: EdgeInsets.all(5.0),
decoration: BoxDecoration(
color: kLightGrey,
borderRadius: BorderRadius.all(
Radius.circular(50),
),
),
child: TabBar(
tabs: <Tab>[Tab(text: kArtwork), Tab(text: kPastJobs)],
unselectedLabelColor: Colors.black54,
labelColor: Colors.black,
unselectedLabelStyle: kBoldText,
labelStyle: kBoldText,
indicatorSize: TabBarIndicatorSize.tab,
indicator: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(50),
color: Colors.white,
),
),
),
const SizedBox(height: kCommonSeparation),
Container(
height: 200,
child: TabBarView(
controller: _tabController,
children: [ArtworkTab(widget.posts), PastJobsTab()]
)
),
],
),
),
);
}
Итак, я делаю быстрый виджет, чтобы решить эту проблему, свободно использовать:
import 'package:flutter/material.dart';
class CustomEasyTabBar extends StatefulWidget {
final List<Tab> tabs;
final List<Widget> pages;
CustomEasyTabBar({
@required this.tabs,
@required this.pages,
}) {
assert(tabs != null && pages != null);
assert(tabs.length == pages.length);
}
@override
_CustomEasyTabBarState createState() => _CustomEasyTabBarState();
}
class _CustomEasyTabBarState extends State<CustomEasyTabBar>
with TickerProviderStateMixin {
TabController tabController;
int currentTabIndex = 0;
@override
void dispose() {
tabController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
this.tabController = TabController(
initialIndex: 0,
length: this.widget.tabs.length,
vsync: this,
);
this.tabController.addListener(() {
setState(() {
this.currentTabIndex = this.tabController.index;
});
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
_builderTabs(this.widget.tabs),
_builderPages(this.currentTabIndex, this.widget.pages),
],
);
}
Widget _builderPages(int currentIndex, List<Widget> pages) {
int localIndex = 0;
return Column(
children: pages.map<Widget>((e) {
if (localIndex == currentIndex) {
localIndex++;
return e;
}
localIndex++;
return Container();
}).toList(),
);
}
Widget _builderTabs(List<Tab> tabs) {
double width = MediaQuery.of(context).size.width;
return Container(
width: width,
decoration: BoxDecoration(color: CustomColors.primary),
child: Center(
child: TabBar(
controller: tabController,
indicatorWeight: 4,
labelColor: Colors.white,
unselectedLabelColor: Colors.white30,
indicatorColor: CustomColors.secondary,
isScrollable: true,
tabs: tabs,
),
),
);
}
}