From 5ec51c31fd26d65ce3816dc7d0ab1fa132b61409 Mon Sep 17 00:00:00 2001 From: tzw Date: Tue, 23 Jan 2024 17:48:34 +0630 Subject: [PATCH] update pagination listener --- lib/domain/entities/pickup.dart | 18 +-- lib/pages/carton/model/carton_model.dart | 44 +++----- lib/pages/customer/model/customer_model.dart | 6 + lib/pages/package/model/package_model.dart | 106 ++++++++---------- lib/pages/package/package_list.dart | 7 +- lib/pages/pickup/model/pickup_model.dart | 27 ++--- lib/pages/pickup/pickup_list.dart | 2 +- lib/pages/processing/processing_list.dart | 5 +- lib/pages/processing_old/processing_list.dart | 5 +- lib/pages/receiving/receiving_list.dart | 10 +- lib/pages/widgets/local_dropdown.dart | 1 - lib/pagination/paginator_listener.dart | 75 +++++++------ lib/pagination/paginator_listview.dart | 61 +++++++--- 13 files changed, 186 insertions(+), 181 deletions(-) diff --git a/lib/domain/entities/pickup.dart b/lib/domain/entities/pickup.dart index 892a07a..69f1fca 100644 --- a/lib/domain/entities/pickup.dart +++ b/lib/domain/entities/pickup.dart @@ -80,20 +80,20 @@ class Pickup { return Pickup( id: id, pickupDate: _pickupDate.toDate().toLocal(), - pickupNumber: map['pickup_number'], + pickupNumber: map['pickup_number'] ?? "", pickupAddress: _da, fromTime: _fromTime?.toDate().toLocal() ?? null, toTime: _toTime?.toDate().toLocal() ?? null, - staffId: map['pickup_staff_id'], - staffName: map['pickup_staff_name'], - customerID: map['customer_id'], - customerName: map['customer_name'], + staffId: map['pickup_staff_id'] ?? "", + staffName: map['pickup_staff_name'] ?? "", + customerID: map['customer_id'] ?? "", + customerName: map['customer_name'] ?? "", customerRemark: map['customer_remark'] ?? "", completeRemark: map['complete_remark'] ?? "", - rescheduleRemark: map['reschedule_remark'], - zoneID: map['zone_id'], - zoneName: map['zone_name'], - status: map['status'], + rescheduleRemark: map['reschedule_remark'] ?? "", + zoneID: map['zone_id'] ?? "", + zoneName: map['zone_name'] ?? "", + status: map['status'] ?? "", photoUrls: _photoUrls); } diff --git a/lib/pages/carton/model/carton_model.dart b/lib/pages/carton/model/carton_model.dart index e299754..25a12e5 100644 --- a/lib/pages/carton/model/carton_model.dart +++ b/lib/pages/carton/model/carton_model.dart @@ -81,7 +81,7 @@ class CartonModel extends BaseModel { set selectedIndexFilter(int index) { _selectedIndexFilter = index; - _loadCartonsByFilter( + _loadPaginationCartons( _selectedIndexFilter == 1 ? "carton_weight" : "user_name"); notifyListeners(); } @@ -109,12 +109,8 @@ class CartonModel extends BaseModel { Future _initData() async { logout(); _selectedIndexFilter = 1; - cartonsByFilter = PaginatorListener( - (data, id) => Carton.fromMap(data, id), onChange: () { - notifyListeners(); - }, rowPerLoad: 30, insertNewByListener: true); - _loadCartonsByFilter( + _loadPaginationCartons( _selectedIndexFilter == 1 ? "carton_weight" : "user_name"); } @@ -146,30 +142,26 @@ class CartonModel extends BaseModel { } } - Future _loadCartonsByFilter(String orderName) async { + _loadPaginationCartons(String orderName) { if (user == null || !user!.hasCarton()) return null; String path = "/$cartons_collection"; - try { - Query listenerQuery = FirebaseFirestore.instance - .collection("$path") - .where("carton_type", whereIn: [ - carton_from_packages, - carton_from_cartons - ]).where("status", isEqualTo: carton_packed_status); + Query col = FirebaseFirestore.instance.collection(path).where("carton_type", + whereIn: [ + carton_from_packages, + carton_from_cartons + ]).where("status", isEqualTo: carton_packed_status); + Query pageQuery = FirebaseFirestore.instance + .collection(path) + .where("carton_type", + whereIn: [carton_from_packages, carton_from_cartons]) + .where("status", isEqualTo: carton_packed_status) + .orderBy(orderName, descending: true); - Query pageQuery = FirebaseFirestore.instance - .collection("$path") - .where("carton_type", - whereIn: [carton_from_packages, carton_from_cartons]) - .where("status", isEqualTo: carton_packed_status) - .orderBy(orderName, descending: true); - - cartonsByFilter! - .refresh(listeningQuery: listenerQuery, pageQuery: pageQuery); - } catch (e) { - log.warning("Error!! $e"); - } + cartonsByFilter?.close(); + cartonsByFilter = PaginatorListener( + col, pageQuery, (data, id) => Carton.fromMap(data, id), + rowPerLoad: 30); } Paginator? _getDelivered() { diff --git a/lib/pages/customer/model/customer_model.dart b/lib/pages/customer/model/customer_model.dart index 556895d..149e9d1 100644 --- a/lib/pages/customer/model/customer_model.dart +++ b/lib/pages/customer/model/customer_model.dart @@ -7,8 +7,11 @@ import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; +import '../../../pagination/paginator_listener.dart'; + class CustomerModel extends BaseModel { final log = Logger('CustomerModel'); + PaginatorListener? getCustomers; List customers = []; List invitations = []; @@ -28,8 +31,11 @@ class CustomerModel extends BaseModel { if (invitationListener != null) invitationListener!.cancel(); customers = []; invitations = []; + getCustomers?.close(); } + + Future inviteUser(String userName, String phoneNumber) { return Services.instance.userService.inviteUser(userName, phoneNumber); } diff --git a/lib/pages/package/model/package_model.dart b/lib/pages/package/model/package_model.dart index d5e974c..9d57ab4 100644 --- a/lib/pages/package/model/package_model.dart +++ b/lib/pages/package/model/package_model.dart @@ -26,8 +26,8 @@ class PackageModel extends BaseModel { set menuSelectedIndex(int index) { _menuSelectedIndex = index; - _loadPackages(_menuSelectedIndex == 2); - _loadCustomerPackages(_menuSelectedIndex == 2); + _loadPaginationPackages(_menuSelectedIndex == 2); + _loadPaginationCustomerPackages(_menuSelectedIndex == 2); notifyListeners(); } @@ -41,24 +41,11 @@ class PackageModel extends BaseModel { } Future _initData() async { - logout(); _menuSelectedIndex = 1; - packages = PaginatorListener( - (data, id) => Package.fromMap(data, id), onChange: () { - notifyListeners(); - }, rowPerLoad: 30, insertNewByListener: true); - customerPackages = PaginatorListener( - (data, id) => Package.fromMap(data, id), onChange: () { - notifyListeners(); - }, rowPerLoad: 30, insertNewByListener: true); - activePackages = PaginatorListener( - (data, id) => Package.fromMap(data, id), onChange: () { - notifyListeners(); - }, rowPerLoad: 30, insertNewByListener: true); - _loadPackages(_menuSelectedIndex == 2); - _loadCustomerPackages(_menuSelectedIndex == 2); - _loadActivePackages(); + _loadPaginationPackages(_menuSelectedIndex == 2); + _loadPaginationCustomerPackages(_menuSelectedIndex == 2); + _loadPaginationActivePackages(); } @override @@ -68,71 +55,68 @@ class PackageModel extends BaseModel { if (activePackages != null) activePackages!.close(); } - Future _loadPackages(bool isDelivered) async { + _loadPaginationPackages(bool isDelivered) { if (user == null) return; if (!((user!.hasPackages() || user!.hasReceiving() || user!.hasProcessing()))) return; String path = "/$packages_collection"; - try { - Query listenerQuery = FirebaseFirestore.instance - .collection(path) - .where("is_delivered", isEqualTo: isDelivered); - Query pageQuery = FirebaseFirestore.instance - .collection(path) - .where("is_delivered", isEqualTo: isDelivered); + Query col = FirebaseFirestore.instance + .collection(path) + .where("is_delivered", isEqualTo: isDelivered); + Query pageQuery = FirebaseFirestore.instance + .collection(path) + .where("is_delivered", isEqualTo: isDelivered) + .orderBy("update_time", descending: true); - pageQuery = pageQuery.orderBy("update_time", descending: true); - packages!.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery); - } catch (e) { - log.warning("Error!! $e"); - } + packages?.close(); + packages = PaginatorListener( + col, pageQuery, (data, id) => Package.fromMap(data, id), + rowPerLoad: 30); } - Future _loadCustomerPackages(bool isDelivered) async { + _loadPaginationCustomerPackages(bool isDelivered) { if (user == null) return; String path = "/$packages_collection"; - try { - Query listenerQuery = FirebaseFirestore.instance - .collection(path) - .where("is_delivered", isEqualTo: isDelivered) - .where("user_id", isEqualTo: user!.id); - Query pageQuery = FirebaseFirestore.instance - .collection(path) - .where("is_delivered", isEqualTo: isDelivered) - .where("user_id", isEqualTo: user!.id) - .orderBy("update_time", descending: true); + Query col = FirebaseFirestore.instance + .collection(path) + .where("is_delivered", isEqualTo: isDelivered) + .where("user_id", isEqualTo: user!.id); - customerPackages! - .refresh(listeningQuery: listenerQuery, pageQuery: pageQuery); - } catch (e) { - log.warning("Error!! $e"); - } + Query pageQuery = FirebaseFirestore.instance + .collection(path) + .where("is_delivered", isEqualTo: isDelivered) + .where("user_id", isEqualTo: user!.id) + .orderBy("update_time", descending: true); + + customerPackages?.close(); + customerPackages = PaginatorListener( + col, pageQuery, (data, id) => Package.fromMap(data, id), + rowPerLoad: 30); } - Future _loadActivePackages() async { + _loadPaginationActivePackages() { if (user == null) return; if (!((user!.hasPackages() || user!.hasReceiving() || user!.hasProcessing()))) return; String path = "/$packages_collection"; - try { - Query listenerQuery = FirebaseFirestore.instance - .collection(path) - .where("is_delivered", isEqualTo: false); - Query pageQuery = FirebaseFirestore.instance - .collection(path) - .where("is_delivered", isEqualTo: false); + Query col = FirebaseFirestore.instance + .collection(path) + .where("is_delivered", isEqualTo: false); - pageQuery = pageQuery.orderBy("update_time", descending: true); - activePackages! - .refresh(listeningQuery: listenerQuery, pageQuery: pageQuery); - } catch (e) { - log.warning("Error!! $e"); - } + Query pageQuery = FirebaseFirestore.instance + .collection(path) + .where("is_delivered", isEqualTo: false) + .orderBy("update_time", descending: true); + + activePackages?.close(); + activePackages = PaginatorListener( + col, pageQuery, (data, id) => Package.fromMap(data, id), + rowPerLoad: 30); } Future getPackage(String id) async { diff --git a/lib/pages/package/package_list.dart b/lib/pages/package/package_list.dart index 66cb1bb..9e378cf 100644 --- a/lib/pages/package/package_list.dart +++ b/lib/pages/package/package_list.dart @@ -85,11 +85,8 @@ class _PackageListState extends State { ), body: PaginatorListView( paginatorListener: packages!, - rowBuilder: (p) => PackageListRow( - key: ValueKey(p.id), - package: p, - isCustomer: widget.forCustomer, - ), + rowBuilder: (p) => + PackageListRow(package: p, isCustomer: widget.forCustomer), color: primaryColor, )), ); diff --git a/lib/pages/pickup/model/pickup_model.dart b/lib/pages/pickup/model/pickup_model.dart index 8996319..69663e4 100644 --- a/lib/pages/pickup/model/pickup_model.dart +++ b/lib/pages/pickup/model/pickup_model.dart @@ -27,12 +27,7 @@ class PickupModel extends BaseModel { } Future _initData() async { - logout(); - pickups = PaginatorListener((data, id) => Pickup.fromMap(data, id), - onChange: () { - notifyListeners(); - }, rowPerLoad: 30, insertNewByListener: true); - _loadPickups(); + _loadPaginationPickups(); } @override @@ -40,20 +35,18 @@ class PickupModel extends BaseModel { if (pickups != null) pickups!.close(); } - Future _loadPickups() async { + _loadPaginationPickups() { if (user == null) return; String path = "/$pickup_collection"; + Query col = FirebaseFirestore.instance.collection(path); + Query pageQuery = FirebaseFirestore.instance + .collection(path) + .orderBy("update_time", descending: true); - try { - Query listenerQuery = FirebaseFirestore.instance.collection(path); - Query pageQuery = FirebaseFirestore.instance - .collection(path) - .orderBy("update_time", descending: true); - - pickups!.refresh(listeningQuery: listenerQuery, pageQuery: pageQuery); - } catch (e) { - log.warning("Error!! $e"); - } + pickups?.close(); + pickups = PaginatorListener( + col, pageQuery, (data, id) => Pickup.fromMap(data, id), + rowPerLoad: 30); } Future complete( diff --git a/lib/pages/pickup/pickup_list.dart b/lib/pages/pickup/pickup_list.dart index c05cb6b..7556142 100644 --- a/lib/pages/pickup/pickup_list.dart +++ b/lib/pages/pickup/pickup_list.dart @@ -65,7 +65,7 @@ class _PickupListState extends State { ), body: PaginatorListView( paginatorListener: pickups!, - rowBuilder: (p) => PickupListRow(key: ValueKey(p.id), pickup: p), + rowBuilder: (p) => PickupListRow(pickup: p), color: primaryColor, )), ); diff --git a/lib/pages/processing/processing_list.dart b/lib/pages/processing/processing_list.dart index 2fc2691..4ff7a5e 100644 --- a/lib/pages/processing/processing_list.dart +++ b/lib/pages/processing/processing_list.dart @@ -74,10 +74,7 @@ class _ProcessingListState extends State { ), body: PaginatorListView( paginatorListener: packages!, - rowBuilder: (p) => ProcessingListRow( - key: ValueKey(p.id), - package: p, - ), + rowBuilder: (p) => ProcessingListRow(package: p), color: primaryColor, )), ); diff --git a/lib/pages/processing_old/processing_list.dart b/lib/pages/processing_old/processing_list.dart index 949c8fe..4e213bd 100644 --- a/lib/pages/processing_old/processing_list.dart +++ b/lib/pages/processing_old/processing_list.dart @@ -65,10 +65,7 @@ class _ProcessingListState extends State { ), body: PaginatorListView( paginatorListener: packages!, - rowBuilder: (p) => ProcessingListRow( - key: ValueKey(p.id), - package: p, - ), + rowBuilder: (p) => ProcessingListRow(package: p), color: primaryColor, )), ); diff --git a/lib/pages/receiving/receiving_list.dart b/lib/pages/receiving/receiving_list.dart index 0808882..225aef3 100644 --- a/lib/pages/receiving/receiving_list.dart +++ b/lib/pages/receiving/receiving_list.dart @@ -73,13 +73,9 @@ class _ReceivingListState extends State { backgroundColor: primaryColor, ), body: PaginatorListView( - paginatorListener: packages!, - rowBuilder: (p) => ReceivingListRow( - key: ValueKey(p.id), - package: p, - ), - color: primaryColor, - )), + paginatorListener: packages!, + rowBuilder: (p) => ReceivingListRow(package: p), + color: primaryColor)), ); } diff --git a/lib/pages/widgets/local_dropdown.dart b/lib/pages/widgets/local_dropdown.dart index aa6eb8e..612e95d 100644 --- a/lib/pages/widgets/local_dropdown.dart +++ b/lib/pages/widgets/local_dropdown.dart @@ -1,5 +1,4 @@ import 'package:fcs/helpers/theme.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'local_text.dart'; diff --git a/lib/pagination/paginator_listener.dart b/lib/pagination/paginator_listener.dart index f2e0f1f..348303e 100644 --- a/lib/pagination/paginator_listener.dart +++ b/lib/pagination/paginator_listener.dart @@ -1,9 +1,11 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:fcs/pages/widgets/callbacks.dart'; +import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; +import '../pages/widgets/callbacks.dart'; + typedef ToObj = Function(Map data, String id); /* @@ -11,7 +13,7 @@ typedef ToObj = Function(Map data, String id); * and listen to document change based on 'update_time' and 'delete_time' fields * of the document */ -class PaginatorListener { +class PaginatorListener extends ChangeNotifier { final log = Logger('PaginatorListener'); List ids = []; @@ -25,15 +27,18 @@ class PaginatorListener { CallBack? onChange; StreamSubscription? listener; - Query? listeningQuery; - Query? pageQuery; + Query listeningQuery; + Query pageQuery; + bool Function(T obj)? removeOnDataChange; - PaginatorListener(this.toObj, - {this.onChange, this.rowPerLoad = 10, this.insertNewByListener = false}); + PaginatorListener(this.listeningQuery, this.pageQuery, this.toObj, + {this.rowPerLoad = 10, + this.insertNewByListener = true, + this.removeOnDataChange}) { + refresh(); + } - Future refresh({Query? listeningQuery, Query? pageQuery}) { - this.listeningQuery = listeningQuery ?? this.listeningQuery; - this.pageQuery = pageQuery ?? this.pageQuery; + Future refresh() { _clearState(); _initListener(); return _load(); @@ -45,8 +50,9 @@ class PaginatorListener { data = []; ended = false; isLoading = false; - if (listener != null) listener!.cancel(); + listener?.cancel(); listener = null; + notifyListeners(); } void close() { @@ -58,26 +64,25 @@ class PaginatorListener { final String isDeletedField = 'is_deleted'; void _initListener() { Query _query = - listeningQuery!.orderBy(updateTimeField, descending: true).limit(1); + listeningQuery.orderBy(updateTimeField, descending: true).limit(1); _query - .get(GetOptions(source: Source.server)) + .get(const GetOptions(source: Source.server)) .then((QuerySnapshot snapshot) { int count = snapshot.docs.length; int updateTime = 0; if (count == 1) { - Map data = - snapshot.docs[0].data()! as Map; - updateTime = data[updateTimeField]; + updateTime = + (snapshot.docs[0].data() as Map)[updateTimeField]; } - Query _queryListener = listeningQuery! + Query _queryListener = listeningQuery .where(updateTimeField, isGreaterThan: updateTime) + // .where(deleteTimeField, isEqualTo: 0) .orderBy(updateTimeField, descending: true); - if (listener != null) listener!.cancel(); listener = _queryListener.snapshots(includeMetadataChanges: true).listen((qs) { - qs.docChanges.forEach((c) { + for (var c in qs.docChanges) { switch (c.type) { case DocumentChangeType.added: _update(c.doc.id, c.doc.data() as Map); @@ -91,7 +96,8 @@ class PaginatorListener { default: } if (onChange != null) onChange!(); - }); + notifyListeners(); + } }); }); } @@ -104,11 +110,15 @@ class PaginatorListener { if ((deleted ?? 0) > 0 || (isDeleted ?? false)) { data.removeAt(ids.indexOf(id)); ids.remove(id); + } else if (removeOnDataChange != null && removeOnDataChange!(t)) { + data.removeAt(ids.indexOf(id)); + ids.remove(id); } else { data.removeAt(ids.indexOf(id)); data.insert(ids.indexOf(id), t); } } else if (insertNewByListener) { + if (removeOnDataChange != null && removeOnDataChange!(t)) return; data.insert(0, t); ids.insert(0, id); } @@ -130,37 +140,38 @@ class PaginatorListener { } Future loadMore() { - return this._load(); + return _load(); } Future _load({CallBack? onStarted, CallBack? onFinished}) async { if (ended) return ended; Query _query = - prev != null ? pageQuery!.startAfterDocument(prev!) : pageQuery!; + prev != null ? pageQuery.startAfterDocument(prev!) : pageQuery; try { isLoading = true; if (onStarted != null) { onStarted(); } if (onChange != null) onChange!(); - await _query - .where(isDeletedField, isEqualTo: false) + notifyListeners(); + QuerySnapshot snapshot = await _query + .where(deleteTimeField, isEqualTo: 0) .limit(rowPerLoad) - .get(GetOptions(source: Source.server)) - .then((QuerySnapshot snapshot) { - int count = snapshot.docs.length; - ended = count < rowPerLoad; - prev = count > 0 ? snapshot.docs[count - 1] : prev; - snapshot.docs.forEach((e) { - _add(e.id, e.data() as Map); - }); - }); + .get(const GetOptions(source: Source.server)); + + int count = snapshot.docs.length; + ended = count < rowPerLoad; + prev = count > 0 ? snapshot.docs[count - 1] : prev; + for (var e in snapshot.docs) { + _add(e.id, e.data() as Map); + } } catch (e) { log.warning("Error!! $e"); } finally { isLoading = false; if (onFinished != null) onFinished(); if (onChange != null) onChange!(); + notifyListeners(); } return ended; } diff --git a/lib/pagination/paginator_listview.dart b/lib/pagination/paginator_listview.dart index b5ee134..29110bc 100644 --- a/lib/pagination/paginator_listview.dart +++ b/lib/pagination/paginator_listview.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -6,20 +5,25 @@ import 'paginator_listener.dart'; typedef RowBuilder = Widget Function(dynamic); typedef OnScroll = void Function(bool down); +typedef OnRemove = Function(dynamic t); -class PaginatorListView extends StatelessWidget { +class PaginatorListView extends StatefulWidget { final PaginatorListener paginatorListener; final RowBuilder rowBuilder; final OnScroll? onScroll; final ScrollController _scrollController; final Color color; + final OnRemove? onRemove; + final Widget? noMoreData; PaginatorListView( {Key? key, required this.paginatorListener, required this.rowBuilder, this.onScroll, - this.color = Colors.blueAccent}) + this.color = Colors.blueAccent, + this.noMoreData, + this.onRemove}) : _scrollController = ScrollController(), super(key: key) { _scrollController.addListener(() async { @@ -35,10 +39,37 @@ class PaginatorListView extends StatelessWidget { }); } + @override + State> createState() => _PaginatorListViewState(); +} + +class _PaginatorListViewState extends State> { + late PaginatorListener _paginatorListener; + @override + initState() { + super.initState(); + initListener(); + } + + @override + void didUpdateWidget(covariant PaginatorListView oldWidget) { + super.didUpdateWidget(oldWidget); + initListener(); + } + + initListener() { + _paginatorListener = widget.paginatorListener; + widget.paginatorListener.addListener(() { + if (mounted) { + setState(() {}); + } + }); + } + @override Widget build(BuildContext context) { - bool ended = paginatorListener.ended; - int count = paginatorListener.data.length; + bool ended = _paginatorListener.ended; + int count = _paginatorListener.data.length; if (ended) count++; return Column( @@ -46,12 +77,12 @@ class PaginatorListView extends StatelessWidget { Expanded( child: RefreshIndicator( onRefresh: () { - return paginatorListener.refresh(); + return _paginatorListener.refresh(); }, child: ListView.separated( separatorBuilder: (context, index) => Divider(height: 1, color: Colors.black), - controller: _scrollController, + controller: widget._scrollController, scrollDirection: Axis.vertical, physics: const AlwaysScrollableScrollPhysics(), shrinkWrap: true, @@ -60,22 +91,24 @@ class PaginatorListView extends StatelessWidget { if (ended && index == count - 1) { return Padding( padding: const EdgeInsets.all(8.0), - child: Center(child: Text("No more data")), + child: Center( + child: + widget.noMoreData ?? const Text("No more data")), ); } - T t = paginatorListener.data[index]; - return rowBuilder(t); + T t = _paginatorListener.data[index]; + return widget.rowBuilder(t); }), ), ), - paginatorListener.isLoading ? _loadingRow() : Container() + _paginatorListener.isLoading ? _loadingRow() : Container() ], ); } Widget _loadingRow() { return Container( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), color: Colors.transparent, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -83,10 +116,10 @@ class PaginatorListView extends StatelessWidget { Column( children: [ CircularProgressIndicator( - valueColor: new AlwaysStoppedAnimation(color)), + valueColor: AlwaysStoppedAnimation(widget.color)), Text( "Loading...", - style: TextStyle(color: color), + style: TextStyle(color: widget.color), ) ], ),