我们有一个包含 6-7 个选项卡的页面。 每当我们切换选项卡时,都会获取相应的数据。 现在的问题是,如果用户轻轻触摸选项卡,使选项卡不会完全切换并返回,则下一个选项卡中的数据会在当前选项卡中获取。
我试过改变 tabbarview 的物理特性。
有没有办法确保只有在完全切换选项卡时才获取数据?
这是代码,
在我的订单控制器中,
late TabController tabController;
tabController = TabController(length: 7, vsync: this);
在我的订单屏幕中,
TabBar(
controller: orderController.tabController,
onTap: (index) {
searchController.searchText.value.clear();
},
isScrollable: true,
labelPadding: EdgeInsets.symmetric(horizontal: 8.w),
indicatorSize: TabBarIndicatorSize.tab,
labelColor: Constants.TextBlack,
unselectedLabelColor: Constants.TextBlack,
indicatorWeight: 3.h,
indicatorColor: Constants.BackgroundBlue,
labelStyle: ThemeStyles.NormalBold,
tabs: [
Tab(
child: Text('All', style: ThemeStyles.NormalBold),
),
Tab(
child: Text('Unfulfilled', style: ThemeStyles.NormalBold),
),
Tab(
child: Text('Fulfilled', style: ThemeStyles.NormalBold),
),
Tab(
child: Text('Partially Refunded', style: ThemeStyles.NormalBold),
),
Tab(
child: Text('Refunded', style: ThemeStyles.NormalBold),
),
Tab(
child: Text('Hold', style: ThemeStyles.NormalBold),
),
Tab(
child: Text('Dispute', style: ThemeStyles.NormalBold),
),
],
),
),
SizedBox(height: 4.h),
Expanded(
child:
TabBarView(
controller: orderController.tabController,
children: const [
AllOrdersView(),
AllOrdersView(status: 0),
AllOrdersView(status: 1),
AllOrdersView(status: 4),
AllOrdersView(status: 3),
AllOrdersView(status: 9),
AllOrdersView(status: 10),
],
),
在 AllOrderView() 中,
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
class AllOrdersView extends StatefulWidget {
final int? status;
const AllOrdersView({Key? key, this.status}) : super(key: key);
@override
State<AllOrdersView> createState() => _AllOrdersViewState();
}
class _AllOrdersViewState extends State<AllOrdersView> with TickerProviderStateMixin
{
bool isLoadingFirst = false;
bool isLoading = false;
int page = 1;
int totalPages = 0;
RefreshController paginateController = RefreshController();
AllOrdersModel? orderModel = AllOrdersModel();
List<OrderDatum> ordersList = [];
final controller = Get.find<OrderController>();
Future<void> fetchOrders() async {
widget.status != null ? await controller.fetchOrdersList(isFirst: true, status: widget.status) : await controller.fetchAllOrdersList(isFirst: true);
}
late AnimationController animationController;
late AnimationController animationController2;
@override
void initState() {
super.initState();
animationController = AnimationController(vsync: this);
animationController2 = AnimationController(vsync: this);
WidgetsBinding.instance!.addPostFrameCallback((_) {
fetchOrders();
});
}
@override
void setState(VoidCallback fn) {
if (mounted) {
super.setState(fn);
}
}
@override
void dispose() {
animationController.dispose();
animationController2.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
SizedBox(height: 8.h),
widget.status != null
? Obx(() => controller.firstLoading.value == true
? Expanded(child: AlertWidgets.IULoading(animationController1: animationController, animationController2: animationController2))
: controller.allOrdersList.value.isEmpty
? SizedBox(
height: 50.h,
width: Get.width,
child: Center(child: Text("No orders found", style: ThemeStyles.NormalBold)),
)
: Expanded(
child: ExcludeSemantics(
child: SmartRefresher(
controller: paginateController,
enablePullUp: true,
// enablePullDown: true,
enablePullDown: false,
onRefresh: () async {
controller.searchOrder.value = "";
if (totalPages >= page) {
await controller.fetchOrdersList(isFirst: true, status: widget.status);
if (controller.loading.value == false) {
paginateController.loadComplete();
} else {
paginateController.loadFailed();
}
} else {
paginateController.loadNoData();
}
},
onLoading: () async {
if (totalPages >= page) {
await controller.fetchOrdersList(isFirst: false, status: widget.status);
if (controller.loading.value == false) {
paginateController.loadComplete();
} else {
paginateController.loadFailed();
}
} else {
paginateController.loadNoData();
}
},
child: ListView.builder(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
padding: EdgeInsets.zero,
itemCount: controller.allOrdersList.value.length,
itemBuilder: (context, index) {
var item = controller.allOrdersList.value[index];
return OrderCard(
orderDatum: item,
status: widget.status,
);
}),
),
),
))
: Obx(
() => controller.firstLoading.isTrue
? Expanded(child: AlertWidgets.IULoading(animationController1: animationController, animationController2: animationController2))
: controller.allOrdersList.isEmpty
? SizedBox(
height: 50.h,
width: Get.width,
child: Center(child: Text("No orders found", style: ThemeStyles.NormalBold)),
)
: Expanded(
child: ExcludeSemantics(
child: SmartRefresher(
controller: paginateController,
enablePullUp: true,
enablePullDown: true,
onRefresh: () async {
controller.searchOrder.value = "";
await controller.fetchAllOrdersList(isFirst: true);
if (controller.firstLoading.value == false) {
paginateController.loadComplete();
} else {
paginateController.loadFailed();
}
},
onLoading: () async {
if (controller.totalPages.value >= controller.page.value) {
await controller.fetchAllOrdersList(isFirst: false);
if (controller.loading.value == false) {
paginateController.loadComplete();
} else {
paginateController.loadFailed();
}
} else {
paginateController.loadNoData();
}
},
child: ListView.builder(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
padding: EdgeInsets.zero,
itemCount: controller.allOrdersList.length,
itemBuilder: (context, index) {
var item = controller.allOrdersList[index];
return OrderCard(
orderDatum: item,
);
}),
),
),
),
),
]);
}
}