add loader and cache on images

merge-update-with-lab-changes
Elham Rababh 4 years ago
parent 1e1e230908
commit 47e19c4ab5

@ -36,7 +36,7 @@ class ProductDetailViewModel extends BaseViewModel{
Future getProductLocationData() async { Future getProductLocationData() async {
hasError = false; hasError = false;
setState(ViewState.Busy); setState(ViewState.BusyLocal);
await _productDetailService.getProductAvailabiltyDetail(); await _productDetailService.getProductAvailabiltyDetail();
if (_productDetailService.hasError) { if (_productDetailService.hasError) {
error = _productDetailService.error; error = _productDetailService.error;

@ -6,14 +6,12 @@ import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AvailabilityInfo extends StatelessWidget { class AvailabilityInfo extends StatelessWidget {
final ProductDetailViewModel previousModel;
const AvailabilityInfo({Key key, this.previousModel}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<ProductDetailViewModel>( return previousModel.productLocationService.length == 0
onModelReady: (model) => model.getProductLocationData(),
allowAny: true,
builder: (_, model, wi) => NetworkBaseView(
baseViewModel: model,
child: model.productLocationService.length == 0
? Container( ? Container(
padding: EdgeInsets.all(15), padding: EdgeInsets.all(15),
alignment: Alignment.center, alignment: Alignment.center,
@ -25,7 +23,7 @@ class AvailabilityInfo extends StatelessWidget {
physics: ScrollPhysics(), physics: ScrollPhysics(),
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
shrinkWrap: true, shrinkWrap: true,
itemCount: model.productLocationService.length, itemCount: previousModel.productLocationService.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Padding( return Padding(
padding: EdgeInsets.all(8.0), padding: EdgeInsets.all(8.0),
@ -36,7 +34,7 @@ class AvailabilityInfo extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
flex: 1, flex: 1,
child: Image.network(model child: Image.network(previousModel
.productLocationService[index].projectImageUrl), .productLocationService[index].projectImageUrl),
), ),
SizedBox( SizedBox(
@ -45,11 +43,11 @@ class AvailabilityInfo extends StatelessWidget {
Expanded( Expanded(
flex: 4, flex: 4,
child: Text( child: Text(
model.productLocationService[index] previousModel.productLocationService[index]
.locationDescription + .locationDescription +
"\n" + "\n" +
convertCityName( convertCityName(
model.productLocationService[0].cityName previousModel.productLocationService[0].cityName
.toString(), .toString(),
), ),
style: TextStyle(fontSize: 12), style: TextStyle(fontSize: 12),
@ -78,8 +76,6 @@ class AvailabilityInfo extends StatelessWidget {
), ),
); );
}, },
),
),
); );
} }
} }

@ -1,5 +1,4 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DiscountDescription extends StatelessWidget { class DiscountDescription extends StatelessWidget {

@ -1,8 +1,5 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/login/login.dart';
import 'package:diplomaticquarterapp/pages/login/welcome.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/footor/quantity_box.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/footor/quantity_box.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';

@ -25,7 +25,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/recommendedProduct_mo
import '../cart-order-page.dart'; import '../cart-order-page.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'ProductAppBar.dart'; import 'shared/product_details_app_bar.dart';
import 'availability_info.dart'; import 'availability_info.dart';
import 'details_info.dart'; import 'details_info.dart';
import 'discount_description.dart'; import 'discount_description.dart';
@ -102,15 +102,16 @@ class __ProductDetailPageState extends State<ProductDetailPage>
} }
Widget build(BuildContext context) { Widget build(BuildContext context) {
ProjectViewModel projectViewModel = Provider.of(context); return BaseView<ProductDetailViewModel>(
final screenSize = MediaQuery.of(context).size; allowAny: true,
builder: (_, model, wi) => AppScaffold(
return AppScaffold(
appBarTitle: TranslationBase.of(context).productDetails, appBarTitle: TranslationBase.of(context).productDetails,
isShowAppBar: true, isShowAppBar: true,
isPharmacy: true, isPharmacy: true,
isShowDecPage: false, isShowDecPage: false,
customAppBar: ProductAppBar(product: widget.product,), customAppBar: ProductAppBar(
product: widget.product,
),
body: SingleChildScrollView( body: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
@ -181,78 +182,6 @@ class __ProductDetailPageState extends State<ProductDetailPage>
SizedBox( SizedBox(
height: 6, height: 6,
), ),
// Container(
// height: 500,
// color: Colors.white,
// child: Scaffold(
// backgroundColor: Colors.white,
// extendBodyBehindAppBar: false,
// appBar: PreferredSize(
// preferredSize: Size.fromHeight(
// MediaQuery.of(context).size.height * 0.070),
// child: Container(
// height: MediaQuery.of(context).size.height * 0.070,
// decoration: BoxDecoration(
// border: Border(
// bottom: BorderSide(
// color: Theme.of(context).dividerColor,
// width: 0.5), //width: 0.7
// ),
// color: Colors.white),
// child: Center(
// child: TabBar(
// isScrollable: false,
// controller: _tabController,
// // indicatorColor: Colors.transparent,
// indicatorWeight: 1.0,
// indicatorSize: TabBarIndicatorSize.tab,
// indicatorColor:Colors.green,
// labelColor: Theme.of(context).primaryColor,
// labelPadding: EdgeInsets.only(
// top: 0, left: 0, right: 0, bottom: 0),
// unselectedLabelColor: Colors.grey[800],
// tabs: [
// tabWidget(screenSize, _activeTab == 0,
// TranslationBase.of(context).details,
// ),
// tabWidget(screenSize, _activeTab == 1,
// TranslationBase.of(context).review,
// ),
// tabWidget(screenSize, _activeTab == 2,
// TranslationBase.of(context).availability),
// ],
// ),
// ),
// ),
// ),
// body: Column(
// children: [
// Expanded(
// child: TabBarView(
// physics: BouncingScrollPhysics(),
// controller: _tabController,
// children: [
// DetailsInfo(
// product: widget.product,
// ),
// ReviewsInfo(
// product: widget.product,
// ),
// AvailabilityInfo()
// ],
// ),
// ),
//
// ],
// ),
// ),
// ),
SizedBox(
height: 6,
),
//TODO Elham* Remove this
Container( Container(
// width: 500, // width: 500,
margin: EdgeInsets.only(bottom: 6), margin: EdgeInsets.only(bottom: 6),
@ -294,7 +223,14 @@ class __ProductDetailPageState extends State<ProductDetailPage>
Column( Column(
children: [ children: [
FlatButton( FlatButton(
onPressed: () { onPressed: () async {
if(widget.product.approvedTotalReviews>0) {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getProductReviewsData(
widget.product.id);
GifLoaderDialogUtils.hideDialog(context);
}
setState(() { setState(() {
isDetails = false; isDetails = false;
isReviews = true; isReviews = true;
@ -322,7 +258,12 @@ class __ProductDetailPageState extends State<ProductDetailPage>
Column( Column(
children: [ children: [
FlatButton( FlatButton(
onPressed: () { onPressed: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getProductLocationData();
GifLoaderDialogUtils.hideDialog(context);
setState(() { setState(() {
isDetails = false; isDetails = false;
isReviews = false; isReviews = false;
@ -356,32 +297,16 @@ class __ProductDetailPageState extends State<ProductDetailPage>
: isReviews : isReviews
? ReviewsInfo( ? ReviewsInfo(
product: widget.product, product: widget.product,
previousModel: model,
) )
: isAvailability : isAvailability
? AvailabilityInfo() ? AvailabilityInfo(
previousModel: model,
)
: Container(), : Container(),
], ],
), ),
), ),
///TODO Elham* check if we need recommanded
// Row(
// children: [
// customerId != null
// ? Container(
// width: 410,
// height: 50,
// color: Colors.white,
// child: Texts(
// TranslationBase.of(context).recommended,
// bold: true,
// ),
// )
// : Container(),
// ],
// ),
// RecommendedProducts(product: widget.product)
SizedBox( SizedBox(
height: 80, height: 80,
) )
@ -398,8 +323,7 @@ class __ProductDetailPageState extends State<ProductDetailPage>
isOverQuantity: isOverQuantity, isOverQuantity: isOverQuantity,
addToCartFunction: addToCartFunction, addToCartFunction: addToCartFunction,
), ),
); ));
} }
} }

@ -10,7 +10,7 @@ import 'package:provider/provider.dart';
import 'package:rating_bar/rating_bar.dart'; import 'package:rating_bar/rating_bar.dart';
import '../../../../locator.dart'; import '../../../../locator.dart';
import 'CustomIcon.dart'; import 'shared/icon_with_bg.dart';
class ProductNameAndPrice extends StatefulWidget { class ProductNameAndPrice extends StatefulWidget {
BuildContext context; BuildContext context;

@ -1,28 +1,22 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:rating_bar/rating_bar.dart'; import 'package:rating_bar/rating_bar.dart';
class ReviewsInfo extends StatelessWidget { class ReviewsInfo extends StatelessWidget {
final PharmacyProduct product; final PharmacyProduct product;
final ProductDetailViewModel previousModel;
const ReviewsInfo({Key key, this.product}) : super(key: key); const ReviewsInfo({Key key, this.product, this.previousModel}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<ProductDetailViewModel>( return previousModel.productDetailService.length != 0 &&
onModelReady: (model) => model.getProductReviewsData(product.id), previousModel.productDetailService[0].reviews.length != 0
allowAny: true,
builder: (_, model, wi) => NetworkBaseView(
baseViewModel:model ,
child: model.productDetailService.length != 0 &&
model.productDetailService[0].reviews.length != 0
? ListView.builder( ? ListView.builder(
physics: ScrollPhysics(), physics: ScrollPhysics(),
itemCount: model.productDetailService[0].reviews.length, itemCount: previousModel.productDetailService[0].reviews.length,
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
@ -37,7 +31,7 @@ class ReviewsInfo extends StatelessWidget {
children: [ children: [
Container( Container(
child: Text( child: Text(
model.productDetailService[0].reviews[index] previousModel.productDetailService[0].reviews[index]
.customerId .customerId
.toString(), .toString(),
style: TextStyle( style: TextStyle(
@ -49,7 +43,7 @@ class ReviewsInfo extends StatelessWidget {
Container( Container(
margin: EdgeInsets.only(left: 210), margin: EdgeInsets.only(left: 210),
child: RatingBar.readOnly( child: RatingBar.readOnly(
initialRating: model.productDetailService[0] initialRating: previousModel.productDetailService[0]
.reviews[index].rating .reviews[index].rating
.toDouble(), .toDouble(),
size: 15.0, size: 15.0,
@ -69,7 +63,7 @@ class ReviewsInfo extends StatelessWidget {
), ),
Container( Container(
child: Text( child: Text(
model.productDetailService[0].reviews[index] previousModel.productDetailService[0].reviews[index]
.reviewText, .reviewText,
style: TextStyle(fontSize: 20), style: TextStyle(fontSize: 20),
), ),
@ -90,8 +84,6 @@ class ReviewsInfo extends StatelessWidget {
TranslationBase.of(context).noReviewsAvailable, TranslationBase.of(context).noReviewsAvailable,
), ),
// Text('No Reviews Available'), // Text('No Reviews Available'),
),
),
); );
} }
} }

@ -11,7 +11,6 @@ class IconWithBg extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
// margin: EdgeInsets.only(left: 25),
width: 40, width: 40,
height: 40, height: 40,
decoration: BoxDecoration( decoration: BoxDecoration(

@ -7,10 +7,10 @@ import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../../locator.dart'; import '../../../../../locator.dart';
import '../../compare-list.dart'; import '../../../compare-list.dart';
import '../cart-order-page.dart'; import '../../cart-order-page.dart';
import 'CustomIcon.dart'; import 'icon_with_bg.dart';
class ProductAppBar extends StatelessWidget with PreferredSizeWidget { class ProductAppBar extends StatelessWidget with PreferredSizeWidget {
Loading…
Cancel
Save