import 'package:mobdr/config/constant.dart'; import 'package:mobdr/config/global_style.dart'; import 'package:mobdr/model/last_search_model.dart'; import 'package:mobdr/ui/general/product_detail/product_detail.dart'; import 'package:mobdr/ui/home/search.dart'; import 'package:mobdr/ui/reusable/reusable_widget.dart'; import 'package:mobdr/ui/reusable/cache_image_network.dart'; import 'package:mobdr/ui/reusable/global_function.dart'; import 'package:flutter/material.dart'; class LastSearchPage extends StatefulWidget { @override _LastSearchPageState createState() => _LastSearchPageState(); } class _LastSearchPageState extends State { // initialize global function and reusable widget final _globalFunction = GlobalFunction(); final _reusableWidget = ReusableWidget(); @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( iconTheme: IconThemeData( color: GlobalStyle.appBarIconThemeColor, ), elevation: GlobalStyle.appBarElevation, title: Text( 'Last Search', style: GlobalStyle.appBarTitle, ), backgroundColor: GlobalStyle.appBarBackgroundColor, systemOverlayStyle: GlobalStyle.appBarSystemOverlayStyle, actions: [ IconButton( icon: Icon(Icons.search, color: BLACK_GREY), onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (context) => SearchPage())); }), ], bottom: _reusableWidget.bottomAppBar(), ), body: WillPopScope( onWillPop: () { Navigator.pop(context); return Future.value(true); }, child: CustomScrollView( shrinkWrap: true, primary: false, physics: AlwaysScrollableScrollPhysics(), slivers: [ SliverPadding( padding: EdgeInsets.fromLTRB(12, 8, 12, 8), sliver: SliverGrid( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, mainAxisSpacing: 8, crossAxisSpacing: 8, childAspectRatio: GlobalStyle.gridDelegateRatio, ), delegate: SliverChildBuilderDelegate( (BuildContext context, int index) { return _buildLastSearchCard(index); }, childCount: lastSearchData.length, ), ), ), ]), )); } Widget _buildLastSearchCard(index) { final double boxImageSize = ((MediaQuery.of(context).size.width) - 24) / 2 - 12; return Container( child: Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), elevation: 2, color: Colors.white, child: GestureDetector( behavior: HitTestBehavior.translucent, onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ProductDetailPage( name: lastSearchData[index].name, image: lastSearchData[index].image, price: lastSearchData[index].price, rating: lastSearchData[index].rating, review: lastSearchData[index].review, sale: lastSearchData[index].sale))); }, child: Column( children: [ ClipRRect( borderRadius: BorderRadius.only( topLeft: Radius.circular(10), topRight: Radius.circular(10)), child: buildCacheNetworkImage( width: boxImageSize, height: boxImageSize, url: lastSearchData[index].image)), Container( margin: EdgeInsets.fromLTRB(8, 8, 8, 8), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( lastSearchData[index].name, style: GlobalStyle.productName, maxLines: 2, overflow: TextOverflow.ellipsis, ), Container( margin: EdgeInsets.only(top: 5), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( '\$ ' + _globalFunction.removeDecimalZeroFormat( lastSearchData[index].price), style: GlobalStyle.productPrice), Text(lastSearchData[index].sale.toString() + ' Sale', style: GlobalStyle.productSale) ], ), ), Container( margin: EdgeInsets.only(top: 5), child: Row( children: [ Icon(Icons.location_on, color: SOFT_GREY, size: 12), Text(' ' + lastSearchData[index].location, style: GlobalStyle.productLocation) ], ), ), Container( margin: EdgeInsets.only(top: 5), child: Row( children: [ _reusableWidget.createRatingBar( rating: lastSearchData[index].rating, size: 12), Text( '(' + lastSearchData[index].review.toString() + ')', style: GlobalStyle.productTotalReview) ], ), ) ], ), ), ], ), ), ), ); } }