pagination added

main_production_asset_tracking
WaseemAbbasi22 3 weeks ago
parent 67dbcc5ab3
commit 7b6783a5da

@ -1,23 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_geojson2/flutter_map_geojson2.dart';
import 'package:latlong2/latlong.dart';
import 'package:mapbox_maps_flutter/mapbox_maps_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/asset_tracking/asset_tracking_provider.dart'; import 'package:test_sa/modules/asset_tracking/asset_tracking_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'asset_tracking_item_view.dart'; import 'asset_tracking_item_view.dart';
import 'map_tracking_page.dart'; import 'map_tracking_page.dart';
@ -46,10 +36,16 @@ class _AssetTrackingPageState extends State<AssetTrackingPage> with SingleTicker
_animationController.forward(); _animationController.forward();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
assetTrackingProvider.reset(); assetTrackingProvider.reset();
assetTrackingProvider.getAssetsFromPenguin(); getAssetsFromPenguin();
}); });
} }
Future<void> getAssetsFromPenguin({bool loadMore = false}) async {
await assetTrackingProvider.getAssetsFromPenguin(
loadMore: loadMore,
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -118,48 +114,60 @@ class _AssetTrackingPageState extends State<AssetTrackingPage> with SingleTicker
return Consumer<AssetTrackingProvider>(builder: (context, provider, _) { return Consumer<AssetTrackingProvider>(builder: (context, provider, _) {
return (provider.assetsList.isEmpty && !provider.isLoading) return (provider.assetsList.isEmpty && !provider.isLoading)
? NoDataFound(message: context.translation.noDataFound).center ? NoDataFound(message: context.translation.noDataFound).center
: ListView.separated( : NotificationListener<ScrollNotification>(
key: const ValueKey('asset-list_view'), onNotification: (scrollInfo) {
padding: const EdgeInsets.all(16), if (!provider.isNextPageLoading && provider.nextPage && scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
itemCount: provider.isLoading ? 6 : provider.assetsList.length, getAssetsFromPenguin(loadMore: true);
separatorBuilder: (listContext, itemIndex) => 12.height, }
itemBuilder: (listContext, itemIndex) { return false;
if (provider.isLoading) return const SizedBox().toAssetListShimmer(listContext, provider.isLoading); },
child: ListView.separated(
// Calculate staggered animation delay key: const ValueKey('asset-list_view'),
final delay = itemIndex * 0.08; padding: const EdgeInsets.all(16),
final animation = Tween<double>(begin: 0.0, end: 1.0).animate( itemCount: provider.isLoading ? 6 : provider.assetsList.length + (provider.isNextPageLoading ? 1 : 0),
CurvedAnimation( separatorBuilder: (listContext, itemIndex) => 12.height,
parent: _animationController, itemBuilder: (listContext, itemIndex) {
curve: Interval( if (provider.isLoading) return const SizedBox().toAssetListShimmer(listContext, provider.isLoading);
delay.clamp(0.0, 0.7), if (itemIndex >= provider.assetsList.length) {
(delay + 0.4).clamp(0.0, 1.0), return const Padding(
curve: Curves.easeOut, padding: EdgeInsets.symmetric(vertical: 16),
child: Center(child: CircularProgressIndicator()),
);
}
final delay = itemIndex * 0.08;
final animation = Tween<double>(begin: 0.0, end: 1.0).animate(
CurvedAnimation(
parent: _animationController,
curve: Interval(
delay.clamp(0.0, 0.7),
(delay + 0.4).clamp(0.0, 1.0),
curve: Curves.easeOut,
),
), ),
), );
);
final slideAnimation = Tween<Offset>(
final slideAnimation = Tween<Offset>( begin: const Offset(0.0, 0.15),
begin: const Offset(0.0, 0.15), end: Offset.zero,
end: Offset.zero, ).animate(
).animate( CurvedAnimation(
CurvedAnimation( parent: _animationController,
parent: _animationController, curve: Interval(
curve: Interval( delay.clamp(0.0, 0.7),
delay.clamp(0.0, 0.7), (delay + 0.4).clamp(0.0, 1.0),
(delay + 0.4).clamp(0.0, 1.0), curve: Curves.easeOutCubic,
curve: Curves.easeOutCubic, ),
), ),
), );
);
return FadeTransition(
return FadeTransition( opacity: animation,
opacity: animation, child: SlideTransition(position: slideAnimation, child: AssetTrackingListItemView(provider.assetsList[itemIndex])).onPress(() {
child: SlideTransition(position: slideAnimation, child: AssetTrackingListItemView(provider.assetsList[itemIndex])).onPress(() { Navigator.push(context, MaterialPageRoute(builder: (context) => MapTrackingPage(assetTrackingData: provider.assetsList[itemIndex])));
Navigator.push(context, MaterialPageRoute(builder: (context) => MapTrackingPage(assetTrackingData: provider.assetsList[itemIndex]))); }),
}), );
); },
}, ),
); );
}); });
} }
@ -173,56 +181,78 @@ class _AssetTrackingPageState extends State<AssetTrackingPage> with SingleTicker
// //
// padding: const EdgeInsets.all(16), // padding: const EdgeInsets.all(16),
GridView.builder( NotificationListener<ScrollNotification>(
key: const ValueKey('asset-grid_view'), onNotification: (scrollInfo) {
padding: const EdgeInsets.all(16), if (!provider.isLoading &&
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( !provider.isNextPageLoading &&
crossAxisCount: 2, provider.nextPage &&
childAspectRatio: .8, scrollInfo.metrics.pixels >= (scrollInfo.metrics.maxScrollExtent - 200)) {
crossAxisSpacing: 12, getAssetsFromPenguin(loadMore: true);
mainAxisSpacing: 12, }
), return false;
},
child: Column(
children: [
Expanded(
child: GridView.builder(
key: const ValueKey('asset-grid_view'),
padding: const EdgeInsets.all(16),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: .8,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
),
itemCount: provider.isLoading ? 6 : provider.assetsList.length,
// separatorBuilder: (listContext, itemIndex) => 12.height,
itemBuilder: (listContext, itemIndex) {
if (provider.isLoading) return const SizedBox().toAssetListShimmer(listContext, provider.isLoading);
itemCount: provider.isLoading ? 6 : provider.assetsList.length, // Calculate staggered animation delay
// separatorBuilder: (listContext, itemIndex) => 12.height, final delay = itemIndex * 0.08;
final animation = Tween<double>(begin: 0.0, end: 1.0).animate(
itemBuilder: (listContext, itemIndex) { CurvedAnimation(
if (provider.isLoading) return const SizedBox().toAssetListShimmer(listContext, provider.isLoading); parent: _animationController,
curve: Interval(
// Calculate staggered animation delay delay.clamp(0.0, 0.7),
final delay = itemIndex * 0.08; (delay + 0.4).clamp(0.0, 1.0),
final animation = Tween<double>(begin: 0.0, end: 1.0).animate( curve: Curves.easeOut,
CurvedAnimation( ),
parent: _animationController, ),
curve: Interval( );
delay.clamp(0.0, 0.7),
(delay + 0.4).clamp(0.0, 1.0), final slideAnimation = Tween<Offset>(
curve: Curves.easeOut, begin: const Offset(0.0, 0.15),
end: Offset.zero,
).animate(
CurvedAnimation(
parent: _animationController,
curve: Interval(
delay.clamp(0.0, 0.7),
(delay + 0.4).clamp(0.0, 1.0),
curve: Curves.easeOutCubic,
),
),
);
return FadeTransition(
opacity: animation,
child: SlideTransition(position: slideAnimation, child: AssetTrackingListItemView(provider.assetsList[itemIndex])).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => MapTrackingPage(assetTrackingData: provider.assetsList[itemIndex])));
}),
);
},
), ),
), ),
); if (provider.isNextPageLoading)
const Padding(
final slideAnimation = Tween<Offset>( padding: EdgeInsets.symmetric(vertical: 16),
begin: const Offset(0.0, 0.15), child: Center(child: CircularProgressIndicator()),
end: Offset.zero,
).animate(
CurvedAnimation(
parent: _animationController,
curve: Interval(
delay.clamp(0.0, 0.7),
(delay + 0.4).clamp(0.0, 1.0),
curve: Curves.easeOutCubic,
), ),
), ],
); ),
return FadeTransition(
opacity: animation,
child: SlideTransition(position: slideAnimation, child: AssetTrackingListItemView(provider.assetsList[itemIndex])).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => MapTrackingPage(assetTrackingData: provider.assetsList[itemIndex])));
}),
);
},
); );
}); });
} }

@ -13,7 +13,7 @@ class AssetTrackingProvider extends ChangeNotifier {
bool isNextPageLoading = false; bool isNextPageLoading = false;
final pageItemNumber = 12; final pageItemNumber = 12;
int pageNo = 1; int pageNo = 1;
bool nextPage = false;
List<AssetTrackingModel> assetsList = []; List<AssetTrackingModel> assetsList = [];
List<AssetTrackingModel> assetsOnTheFloorList = []; List<AssetTrackingModel> assetsOnTheFloorList = [];
@ -30,6 +30,9 @@ class AssetTrackingProvider extends ChangeNotifier {
reset() { reset() {
isLoading = false; isLoading = false;
isNextPageLoading = false;
pageNo = 1;
nextPage = false;
selectedFloor = null; selectedFloor = null;
selectedBuilding = null; selectedBuilding = null;
selectedSite = null; selectedSite = null;
@ -57,26 +60,31 @@ class AssetTrackingProvider extends ChangeNotifier {
final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: payload); final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: payload);
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
final Map<String, dynamic> jsonData = json.decode(response.body); final Map<String, dynamic> jsonData = json.decode(response.body);
List list = jsonData["data"]; List list = jsonData["data"] ?? [];
assetsList.addAll(list.map((item) => AssetTrackingModel.fromJson(item)).toList()); List<AssetTrackingModel> responseAssetList = list.map((item) => AssetTrackingModel.fromJson(item)).toList();
if (jsonData["totalRows"] <= assetsList.length) {
// nextPage = true; // assetsList.addAll(list.map((item) => AssetTrackingModel.fromJson(item)).toList());
} // if (jsonData["totalRows"] <= assetsList.length) {
// if (loadMore) { // nextPage = true;
// assetInventoryResponse?.assetList?.addAll(newResponse.assetList ?? []);
// assetInventoryResponse?.totalRows = newResponse.totalRows;
// } else {
// assetInventoryResponse = newResponse;
// } // }
// nextPage = (assetInventoryResponse?.assetList?.length ?? 0) < (assetInventoryResponse?.totalRows ?? 0); if (loadMore) {
assetsList.addAll(responseAssetList);
// assetInventoryResponse?.totalRows = newResponse.totalRows;
} else {
assetsList = responseAssetList;
// assetInventoryResponse = newResponse;
}
final int totalRows = (jsonData["totalRows"] as int?) ?? assetsList.length;
nextPage = (assetsList.length) < totalRows;
} else { } else {
// nextPage = false; if (loadMore) pageNo -= 1;
} }
isLoading = false; isLoading = false;
isNextPageLoading = false; isNextPageLoading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch (error) { } catch (error) {
if (loadMore) pageNo -= 1;
isLoading = false; isLoading = false;
isNextPageLoading = false; isNextPageLoading = false;
// stateCode = -1; // stateCode = -1;
@ -86,6 +94,7 @@ class AssetTrackingProvider extends ChangeNotifier {
} }
} }
Future getAssetsFromPenguinByFloor() async { Future getAssetsFromPenguinByFloor() async {
try { try {
assetsOnTheFloorList.clear(); assetsOnTheFloorList.clear();

Loading…
Cancel
Save