【发布时间】: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