add loader and cache on images

merge-requests/415/head
Elham Rababh 5 years ago
parent 1e1e230908
commit 47e19c4ab5

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

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

@ -1,8 +1,5 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.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/uitl/translations_delegate_base.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 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'ProductAppBar.dart';
import 'shared/product_details_app_bar.dart';
import 'availability_info.dart';
import 'details_info.dart';
import 'discount_description.dart';
@ -102,15 +102,16 @@ class __ProductDetailPageState extends State<ProductDetailPage>
}
Widget build(BuildContext context) {
ProjectViewModel projectViewModel = Provider.of(context);
final screenSize = MediaQuery.of(context).size;
return AppScaffold(
return BaseView<ProductDetailViewModel>(
allowAny: true,
builder: (_, model, wi) => AppScaffold(
appBarTitle: TranslationBase.of(context).productDetails,
isShowAppBar: true,
isPharmacy: true,
isShowDecPage: false,
customAppBar: ProductAppBar(product: widget.product,),
customAppBar: ProductAppBar(
product: widget.product,
),
body: SingleChildScrollView(
child: Column(
children: [
@ -181,78 +182,6 @@ class __ProductDetailPageState extends State<ProductDetailPage>
SizedBox(
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(
// width: 500,
margin: EdgeInsets.only(bottom: 6),
@ -294,7 +223,14 @@ class __ProductDetailPageState extends State<ProductDetailPage>
Column(
children: [
FlatButton(
onPressed: () {
onPressed: () async {
if(widget.product.approvedTotalReviews>0) {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getProductReviewsData(
widget.product.id);
GifLoaderDialogUtils.hideDialog(context);
}
setState(() {
isDetails = false;
isReviews = true;
@ -322,7 +258,12 @@ class __ProductDetailPageState extends State<ProductDetailPage>
Column(
children: [
FlatButton(
onPressed: () {
onPressed: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getProductLocationData();
GifLoaderDialogUtils.hideDialog(context);
setState(() {
isDetails = false;
isReviews = false;
@ -356,32 +297,16 @@ class __ProductDetailPageState extends State<ProductDetailPage>
: isReviews
? ReviewsInfo(
product: widget.product,
previousModel: model,
)
: isAvailability
? AvailabilityInfo()
? AvailabilityInfo(
previousModel: model,
)
: 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(
height: 80,
)
@ -398,8 +323,7 @@ class __ProductDetailPageState extends State<ProductDetailPage>
isOverQuantity: isOverQuantity,
addToCartFunction: addToCartFunction,
),
);
));
}
}

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

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

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

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