addres
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:grocery_app/src/common_widget/network_image.dart';
|
||||
import 'package:grocery_app/src/logic/provider/home_provider.dart';
|
||||
import 'package:grocery_app/utils/constants/assets_constant.dart';
|
||||
import 'package:grocery_app/utils/constants/color_constant.dart';
|
||||
import 'package:grocery_app/utils/extensions/uicontext.dart';
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class BestDealScreen extends StatefulWidget {
|
||||
const BestDealScreen({super.key});
|
||||
@@ -17,221 +19,259 @@ class _BestDealScreenState extends State<BestDealScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
leading: Center(
|
||||
child: SizedBox(
|
||||
height: 20,
|
||||
width: 20,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: SvgPicture.asset(
|
||||
APPASSETS.back,
|
||||
height: 20,
|
||||
width: 20,
|
||||
)),
|
||||
),
|
||||
),
|
||||
title: const Text(
|
||||
"Best Deal",
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
InkWell(
|
||||
onTap: () {},
|
||||
child: Icon(
|
||||
MdiIcons.magnify,
|
||||
size: 35,
|
||||
appBar: AppBar(
|
||||
backgroundColor: Colors.white,
|
||||
centerTitle: true,
|
||||
leading: Center(
|
||||
child: SizedBox(
|
||||
height: 20,
|
||||
width: 20,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: SvgPicture.asset(
|
||||
APPASSETS.back,
|
||||
height: 20,
|
||||
width: 20,
|
||||
)),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
floatingActionButton: Padding(
|
||||
padding: const EdgeInsets.only(left: 30),
|
||||
child: Container(
|
||||
height: 80,
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
decoration: BoxDecoration(color: APPCOLOR.lightGreen, borderRadius: BorderRadius.circular(15)),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 80,
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
height: 70,
|
||||
width: 70,
|
||||
decoration: BoxDecoration(color: Colors.white.withOpacity(0.5), borderRadius: BorderRadius.circular(10)),
|
||||
),
|
||||
const Positioned(
|
||||
left: 20,
|
||||
bottom: 0,
|
||||
top: 0,
|
||||
right: 0,
|
||||
child: AppNetworkImage(
|
||||
),
|
||||
title: const Text(
|
||||
"Best Deal",
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
InkWell(
|
||||
onTap: () {},
|
||||
child: Icon(
|
||||
MdiIcons.magnify,
|
||||
size: 35,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
floatingActionButton: Padding(
|
||||
padding: const EdgeInsets.only(left: 30),
|
||||
child: Container(
|
||||
height: 80,
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
decoration: BoxDecoration(
|
||||
color: APPCOLOR.lightGreen,
|
||||
borderRadius: BorderRadius.circular(15)),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 80,
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
height: 70,
|
||||
width: 70,
|
||||
radius: 10,
|
||||
imageUrl: "https://5.imimg.com/data5/SELLER/Default/2024/2/385126988/OL/DA/VW/8627346/1l-fortune-sunflower-oil.jpg",
|
||||
backGroundColor: Colors.white,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white.withOpacity(0.5),
|
||||
borderRadius: BorderRadius.circular(10)),
|
||||
),
|
||||
const Positioned(
|
||||
left: 20,
|
||||
bottom: 0,
|
||||
top: 0,
|
||||
right: 0,
|
||||
child: AppNetworkImage(
|
||||
height: 70,
|
||||
width: 70,
|
||||
radius: 10,
|
||||
imageUrl:
|
||||
"https://5.imimg.com/data5/SELLER/Default/2024/2/385126988/OL/DA/VW/8627346/1l-fortune-sunflower-oil.jpg",
|
||||
backGroundColor: Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'2 Items',
|
||||
style: context.customRegular(Colors.white, 18),
|
||||
),
|
||||
Text(
|
||||
'\$25',
|
||||
style: context.customExtraBold(Colors.white, 20),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'2 Items',
|
||||
style: context.customRegular(Colors.white, 18),
|
||||
),
|
||||
Text(
|
||||
'\$25',
|
||||
style: context.customExtraBold(Colors.white, 20),
|
||||
)
|
||||
],
|
||||
),
|
||||
const Spacer(),
|
||||
Text(
|
||||
'View Cart',
|
||||
style: context.customMedium(Colors.white, 24),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
const Icon(
|
||||
Icons.arrow_forward,
|
||||
color: Colors.white,
|
||||
size: 35,
|
||||
),
|
||||
],
|
||||
const Spacer(),
|
||||
Text(
|
||||
'View Cart',
|
||||
style: context.customMedium(Colors.white, 24),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
const Icon(
|
||||
Icons.arrow_forward,
|
||||
color: Colors.white,
|
||||
size: 35,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(15),
|
||||
child: GridView.builder(
|
||||
itemCount: 20,
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2, childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 1.1), crossAxisSpacing: 10, mainAxisSpacing: 10),
|
||||
itemBuilder: (context, index) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15), boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
blurRadius: 1,
|
||||
offset: const Offset(5, 5),
|
||||
),
|
||||
]),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(5),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
height: 160,
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
// width: 150,
|
||||
decoration: BoxDecoration(color: APPCOLOR.bgGrey, borderRadius: BorderRadius.circular(15)),
|
||||
child: const Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
AppNetworkImage(
|
||||
height: 150,
|
||||
width: 140,
|
||||
imageUrl: "https://5.imimg.com/data5/SELLER/Default/2024/2/385126988/OL/DA/VW/8627346/1l-fortune-sunflower-oil.jpg",
|
||||
backGroundColor: Colors.transparent),
|
||||
Positioned(right: 5, top: 5, child: Icon(Icons.favorite_border))
|
||||
],
|
||||
body: itemBestdeal());
|
||||
}
|
||||
|
||||
Widget itemBestdeal() {
|
||||
return Consumer<ProductProvider>(builder: (context, provider, child) {
|
||||
if (provider.isBestdealingloading) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
} else if (provider.bestdeal.isEmpty) {
|
||||
return Center(child: Text('No products available'));
|
||||
} else {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(15),
|
||||
child: GridView.builder(
|
||||
itemCount: provider.bestdeal.length,
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2,
|
||||
childAspectRatio: MediaQuery.of(context).size.width /
|
||||
(MediaQuery.of(context).size.height / 1.5),
|
||||
crossAxisSpacing: 10,
|
||||
mainAxisSpacing: 10),
|
||||
itemBuilder: (context, index) {
|
||||
var bestdealproduct = provider.bestdeal[index];
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
blurRadius: 1,
|
||||
offset: const Offset(5, 5),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
"Fortune Arhar Dal (Toor Dal)",
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.customMedium(APPCOLOR.balck1A1A1A, 16),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
"500 ML",
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.customMedium(Colors.grey.withOpacity(0.8), 12),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 3,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Row(
|
||||
]),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(5),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
height: 160,
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
// width: 150,
|
||||
decoration: BoxDecoration(
|
||||
color: APPCOLOR.bgGrey,
|
||||
borderRadius: BorderRadius.circular(15)),
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
AppNetworkImage(
|
||||
height: 150,
|
||||
width: 140,
|
||||
imageUrl:
|
||||
bestdealproduct.productImages?.first.url ??
|
||||
"",
|
||||
backGroundColor: Colors.transparent),
|
||||
Positioned(
|
||||
right: 5,
|
||||
top: 5,
|
||||
child: Icon(Icons.favorite_border))
|
||||
],
|
||||
),
|
||||
),
|
||||
Text(
|
||||
bestdealproduct.name ?? "",
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.customMedium(APPCOLOR.balck1A1A1A, 16),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
bestdealproduct.unit ?? "",
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.customMedium(
|
||||
Colors.grey.withOpacity(0.8), 12),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 3,
|
||||
),
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height * 0.005,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
"\$12",
|
||||
"\$${bestdealproduct.discountPrice ?? ""} ",
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.customSemiBold(Colors.black, 16),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 5,
|
||||
style: context.customSemiBold(Colors.black, 12),
|
||||
),
|
||||
Text(
|
||||
"\$14",
|
||||
"\$${bestdealproduct.basePrice ?? ""}",
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: context.customMedium(Colors.grey.withOpacity(0.8), 16).copyWith(
|
||||
style: context
|
||||
.customMedium(
|
||||
Colors.grey.withOpacity(0.8),
|
||||
12,
|
||||
)
|
||||
.copyWith(
|
||||
decoration: TextDecoration.lineThrough,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Align(
|
||||
const Spacer(),
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Container(
|
||||
height: 40,
|
||||
width: 60,
|
||||
height:
|
||||
MediaQuery.of(context).size.height * 0.035,
|
||||
width: MediaQuery.of(context).size.width * 0.1,
|
||||
decoration: BoxDecoration(
|
||||
color: APPCOLOR.lightGreen,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'Add',
|
||||
style: context.customRegular(Colors.white, 12),
|
||||
)),
|
||||
child: Text(
|
||||
'Add',
|
||||
style:
|
||||
context.customRegular(Colors.white, 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grocery_app/src/ui/cart/cartview_screen.dart';
|
||||
import 'package:grocery_app/src/ui/favourite/favourite_screen.dart';
|
||||
import 'package:grocery_app/src/ui/header.dart';
|
||||
import 'package:grocery_app/src/ui/home/home_screen.dart';
|
||||
import 'package:grocery_app/src/ui/profilepage/profile_screen.dart';
|
||||
import 'package:grocery_app/utils/constants/color_constant.dart';
|
||||
@@ -47,10 +48,12 @@ class _BottomBarState extends State<BottomBarWidget> {
|
||||
SizeConfig().init(context);
|
||||
|
||||
return Scaffold(
|
||||
|
||||
body: PageView(
|
||||
controller: bottomWidgetPageController,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
children: <Widget>[
|
||||
|
||||
HomeScreen(),
|
||||
FavouriteScreen(),
|
||||
Mycart(),
|
||||
|
||||
@@ -113,7 +113,7 @@ class _EnterFullNameScreenState extends State<EnterFullNameScreen> {
|
||||
onTap: () async {
|
||||
if (_formKey.currentState?.validate() ?? false) {
|
||||
final success = await pageNotifier.customerRegister(context);
|
||||
|
||||
print("dshfgjkdfjgh ${success}");
|
||||
if (success) {
|
||||
context.clearAndPush(routePath: MyRoutes.BOTTOMNAV);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grocery_app/src/common_widget/network_image.dart';
|
||||
import 'package:grocery_app/src/data/product_model.dart';
|
||||
import 'package:grocery_app/src/ui/header.dart';
|
||||
import 'package:grocery_app/src/ui/widgets/custom_title.dart';
|
||||
import 'package:grocery_app/utils/constants/color_constant.dart';
|
||||
import 'package:grocery_app/utils/extensions/uicontext.dart';
|
||||
|
||||
class FavouriteScreen extends StatefulWidget {
|
||||
@override
|
||||
@@ -37,117 +39,126 @@ class _FavouriteScreenState extends State<FavouriteScreen>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: [
|
||||
CustomTitle(title: 'Favourite'),
|
||||
Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: _favProducts.length,
|
||||
shrinkWrap: true,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (_, index)
|
||||
{
|
||||
_animation = Tween<double>(begin: 0.0, end: 1.0).animate(
|
||||
CurvedAnimation(
|
||||
parent: _animationController,
|
||||
curve: Interval(
|
||||
(0.5 / _favProducts.length) * index,
|
||||
1,
|
||||
curve: Curves.easeOut,
|
||||
),
|
||||
),
|
||||
);
|
||||
_animationController.forward(from: 0);
|
||||
|
||||
return AnimatedBuilder(
|
||||
animation: _animationController,
|
||||
builder: (_, child) {
|
||||
return FadeTransition(
|
||||
opacity: _animation,
|
||||
child: Transform(
|
||||
transform: Matrix4.translationValues(
|
||||
0.0,
|
||||
50 * (1.0 - _animation.value),
|
||||
0.0,
|
||||
return SafeArea(
|
||||
child: Scaffold(
|
||||
body: Padding(
|
||||
padding: context.bodyAllPadding.copyWith(
|
||||
top: 0,
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Header(),
|
||||
// CustomTitle(title: 'Favourite'),
|
||||
Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: _favProducts.length,
|
||||
shrinkWrap: true,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (_, index) {
|
||||
_animation = Tween<double>(begin: 0.0, end: 1.0).animate(
|
||||
CurvedAnimation(
|
||||
parent: _animationController,
|
||||
curve: Interval(
|
||||
(0.5 / _favProducts.length) * index,
|
||||
1,
|
||||
curve: Curves.easeOut,
|
||||
),
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: ListTile(
|
||||
onTap: () {},
|
||||
leading: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.greenAccent.withOpacity(0.1),
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: AppNetworkImage(
|
||||
height: 80,
|
||||
width: 80,
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/originals/a5/f3/5f/a5f35fb23e942809da3df91b23718e8d.png',
|
||||
backGroundColor: APPCOLOR.bgGrey,
|
||||
radius: 10,
|
||||
),
|
||||
),
|
||||
// Image.asset(_favProducts[index].productImage),
|
||||
title: Text(_favProducts[index].productName),
|
||||
subtitle: Text(_favProducts[index].quantity),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(_favProducts[index].amount),
|
||||
Icon(
|
||||
Icons.navigate_next_rounded,
|
||||
size: 32,
|
||||
color: APPCOLOR.gray,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, index) {
|
||||
_animation = Tween<double>(begin: 0.0, end: 1.0).animate(
|
||||
CurvedAnimation(
|
||||
parent: _animationController,
|
||||
curve: Interval(
|
||||
(0.5 / _favProducts.length) * index,
|
||||
1,
|
||||
curve: Curves.easeOut,
|
||||
),
|
||||
),
|
||||
);
|
||||
_animationController.forward(from: 0);
|
||||
return AnimatedBuilder(
|
||||
animation: _animationController,
|
||||
builder: (_, child) {
|
||||
return FadeTransition(
|
||||
opacity: _animation,
|
||||
child: Transform(
|
||||
transform: Matrix4.translationValues(
|
||||
0.0,
|
||||
50 * (1.0 - _animation.value),
|
||||
0.0,
|
||||
);
|
||||
_animationController.forward(from: 0);
|
||||
|
||||
return AnimatedBuilder(
|
||||
animation: _animationController,
|
||||
builder: (_, child) {
|
||||
return FadeTransition(
|
||||
opacity: _animation,
|
||||
child: Transform(
|
||||
transform: Matrix4.translationValues(
|
||||
0.0,
|
||||
50 * (1.0 - _animation.value),
|
||||
0.0,
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: ListTile(
|
||||
onTap: () {},
|
||||
leading: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.greenAccent.withOpacity(0.1),
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: AppNetworkImage(
|
||||
height: 80,
|
||||
width: 80,
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/originals/a5/f3/5f/a5f35fb23e942809da3df91b23718e8d.png',
|
||||
backGroundColor: APPCOLOR.bgGrey,
|
||||
radius: 10,
|
||||
),
|
||||
),
|
||||
// Image.asset(_favProducts[index].productImage),
|
||||
title: Text(_favProducts[index].productName),
|
||||
subtitle: Text(_favProducts[index].quantity),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(_favProducts[index].amount),
|
||||
Icon(
|
||||
Icons.navigate_next_rounded,
|
||||
size: 32,
|
||||
color: APPCOLOR.gray,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Divider(),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, index) {
|
||||
_animation = Tween<double>(begin: 0.0, end: 1.0).animate(
|
||||
CurvedAnimation(
|
||||
parent: _animationController,
|
||||
curve: Interval(
|
||||
(0.5 / _favProducts.length) * index,
|
||||
1,
|
||||
curve: Curves.easeOut,
|
||||
),
|
||||
),
|
||||
);
|
||||
_animationController.forward(from: 0);
|
||||
return AnimatedBuilder(
|
||||
animation: _animationController,
|
||||
builder: (_, child) {
|
||||
return FadeTransition(
|
||||
opacity: _animation,
|
||||
child: Transform(
|
||||
transform: Matrix4.translationValues(
|
||||
0.0,
|
||||
50 * (1.0 - _animation.value),
|
||||
0.0,
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Divider(),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
// Padding(
|
||||
// padding:
|
||||
// const EdgeInsets.only(left: 16, right: 16, top: 16, bottom: 78),
|
||||
// child: NectarButton(
|
||||
// onPressed: () {},
|
||||
// text: 'Add All To Cart',
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
),
|
||||
// Padding(
|
||||
// padding:
|
||||
// const EdgeInsets.only(left: 16, right: 16, top: 16, bottom: 78),
|
||||
// child: NectarButton(
|
||||
// onPressed: () {},
|
||||
// text: 'Add All To Cart',
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,12 +71,19 @@ class _FruitVeggieDetailState extends State<FruitVeggieDetail> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget productWidget() {
|
||||
Widget productWidget()
|
||||
{
|
||||
return Consumer<ProductProvider>(builder: (context, provider, child) {
|
||||
if (provider.isLoadingg) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 120),
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (provider.products.isEmpty) {
|
||||
return Center(child: Text('No products available'));
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 80),
|
||||
child: Center(child: Text('No products available')),
|
||||
);
|
||||
} else {
|
||||
return Expanded(
|
||||
child: Padding(
|
||||
@@ -225,136 +232,6 @@ class _FruitVeggieDetailState extends State<FruitVeggieDetail> {
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// Expanded(
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.only(left: 10, right: 10),
|
||||
// child: GridView.builder(
|
||||
// itemCount: provider.products.length,
|
||||
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
// crossAxisCount: 2,
|
||||
// childAspectRatio: MediaQuery.of(context).size.width /
|
||||
// (MediaQuery.of(context).size.height / 1.1),
|
||||
// crossAxisSpacing: 10,
|
||||
// mainAxisSpacing: 10),
|
||||
// itemBuilder: (context, index) {
|
||||
// return Container(
|
||||
// height: MediaQuery.of(context).size.height * 0.28,
|
||||
// // width: 150,
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.white,
|
||||
// borderRadius: BorderRadius.circular(15),
|
||||
// boxShadow: [
|
||||
// BoxShadow(
|
||||
// color: Colors.grey.withOpacity(0.1),
|
||||
// blurRadius: 1,
|
||||
// offset: const Offset(5, 5),
|
||||
// ),
|
||||
// ]),
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.all(5),
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// children: [
|
||||
// Container(
|
||||
// height: 100,
|
||||
// width: 150,
|
||||
// decoration: BoxDecoration(
|
||||
// color: APPCOLOR.bgGrey,
|
||||
// borderRadius: BorderRadius.circular(15)),
|
||||
// child: const Stack(
|
||||
// alignment: Alignment.center,
|
||||
// children: [
|
||||
// AppNetworkImage(
|
||||
// height: 70,
|
||||
// width: 70,
|
||||
// imageUrl:
|
||||
// "https://5.imimg.com/data5/SELLER/Default/2024/2/385126988/OL/DA/VW/8627346/1l-fortune-sunflower-oil.jpg",
|
||||
// backGroundColor: Colors.transparent),
|
||||
// Positioned(
|
||||
// right: 5,
|
||||
// top: 5,
|
||||
// child: Icon(Icons.favorite_border))
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// Text(
|
||||
// "Fortune Arhar Dal (Toor Dal)",
|
||||
// textAlign: TextAlign.left,
|
||||
// maxLines: 2,
|
||||
// overflow: TextOverflow.ellipsis,
|
||||
// style: context.customMedium(APPCOLOR.balck1A1A1A, 14),
|
||||
// ),
|
||||
// const SizedBox(
|
||||
// height: 5,
|
||||
// ),
|
||||
// Text(
|
||||
// "500 ML",
|
||||
// textAlign: TextAlign.left,
|
||||
// maxLines: 1,
|
||||
// overflow: TextOverflow.ellipsis,
|
||||
// style: context.customMedium(
|
||||
// Colors.grey.withOpacity(0.8), 12),
|
||||
// ),
|
||||
// const SizedBox(
|
||||
// height: 3,
|
||||
// ),
|
||||
// Row(
|
||||
// children: [
|
||||
// Column(
|
||||
// children: [
|
||||
// Text(
|
||||
// "\$12",
|
||||
// textAlign: TextAlign.left,
|
||||
// maxLines: 1,
|
||||
// overflow: TextOverflow.ellipsis,
|
||||
// style: context.customSemiBold(Colors.black, 12),
|
||||
// ),
|
||||
// const SizedBox(
|
||||
// width: 5,
|
||||
// ),
|
||||
// Text(
|
||||
// "\$14",
|
||||
// textAlign: TextAlign.left,
|
||||
// maxLines: 1,
|
||||
// overflow: TextOverflow.ellipsis,
|
||||
// style: context
|
||||
// .customMedium(
|
||||
// Colors.grey.withOpacity(0.8), 12)
|
||||
// .copyWith(
|
||||
// decoration: TextDecoration.lineThrough,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// Expanded(
|
||||
// child: Align(
|
||||
// alignment: Alignment.centerRight,
|
||||
// child: Container(
|
||||
// height: 40,
|
||||
// width: 60,
|
||||
// decoration: BoxDecoration(
|
||||
// color: APPCOLOR.lightGreen,
|
||||
// borderRadius: BorderRadius.circular(5),
|
||||
// ),
|
||||
// child: Center(
|
||||
// child: Text(
|
||||
// 'Add',
|
||||
// style:
|
||||
// context.customRegular(Colors.white, 12),
|
||||
// )),
|
||||
// ),
|
||||
// ),
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// ));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -376,10 +253,11 @@ class _FruitVeggieDetailState extends State<FruitVeggieDetail> {
|
||||
itemBuilder: (context, index) {
|
||||
var category = provider.categoryList[index];
|
||||
return InkWell(
|
||||
onTap: ()
|
||||
{
|
||||
onTap: () {
|
||||
provider.isLoadingg = true;
|
||||
provider.gettAllProduct(context, "/category/${category.id}");
|
||||
activeIndexProvider.setActiveIndex(index);
|
||||
},
|
||||
},
|
||||
child: SizedBox(
|
||||
height: 150,
|
||||
child: Column(
|
||||
|
||||
60
lib/src/ui/header.dart
Normal file
60
lib/src/ui/header.dart
Normal file
@@ -0,0 +1,60 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:grocery_app/utils/constants/color_constant.dart';
|
||||
import 'package:grocery_app/utils/extensions/uicontext.dart';
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
|
||||
class Header extends StatelessWidget {
|
||||
const Header({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Icon(
|
||||
MdiIcons.mapMarkerOutline,
|
||||
color: APPCOLOR.appGreen,
|
||||
size: 30,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
"Home",
|
||||
style: context.customMedium(APPCOLOR.black333333, 18),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 5,
|
||||
),
|
||||
Icon(
|
||||
MdiIcons.chevronDown,
|
||||
color: APPCOLOR.black333333,
|
||||
size: 30,
|
||||
)
|
||||
],
|
||||
),
|
||||
Text(
|
||||
"639| Elgin St. Celina, Delaware 10299",
|
||||
style: context.customMedium(APPCOLOR.grey666666, 14),
|
||||
),
|
||||
],
|
||||
)),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Icon(
|
||||
MdiIcons.shoppingOutline,
|
||||
color: APPCOLOR.balck1A1A1A,
|
||||
size: 30,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,9 @@ import 'package:grocery_app/src/core/routes/routes.dart';
|
||||
import 'package:grocery_app/src/logic/provider/home_provider.dart';
|
||||
import 'package:grocery_app/src/ui/bestdeal/bestdeal_screen.dart';
|
||||
import 'package:grocery_app/src/ui/fruitvegidetail/fruit_veggie_detail.dart';
|
||||
import 'package:grocery_app/src/ui/header.dart';
|
||||
import 'package:grocery_app/utils/constants/color_constant.dart';
|
||||
import 'package:grocery_app/utils/constants/shared_pref_utils.dart';
|
||||
import 'package:grocery_app/utils/extensions/extensions.dart';
|
||||
import 'package:grocery_app/utils/extensions/uicontext.dart';
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
@@ -26,8 +28,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
|
||||
Provider.of<ProductProvider>(context, listen: false).getBanners(context);
|
||||
Provider.of<ProductProvider>(context, listen: false)
|
||||
.gettAllProduct(context);
|
||||
|
||||
.gettAllProduct(context, "");
|
||||
Provider.of<ProductProvider>(context, listen: false)
|
||||
.getBestDealProduct(context);
|
||||
Provider.of<ProductProvider>(context, listen: false)
|
||||
@@ -45,55 +46,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Icon(
|
||||
MdiIcons.mapMarkerOutline,
|
||||
color: APPCOLOR.appGreen,
|
||||
size: 30,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
"Home",
|
||||
style: context.customMedium(
|
||||
APPCOLOR.black333333, 18),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 5,
|
||||
),
|
||||
Icon(
|
||||
MdiIcons.chevronDown,
|
||||
color: APPCOLOR.black333333,
|
||||
size: 30,
|
||||
)
|
||||
],
|
||||
),
|
||||
Text(
|
||||
"639| Elgin St. Celina, Delaware 10299",
|
||||
style: context.customMedium(APPCOLOR.grey666666, 14),
|
||||
),
|
||||
],
|
||||
)),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Icon(
|
||||
MdiIcons.shoppingOutline,
|
||||
color: APPCOLOR.balck1A1A1A,
|
||||
size: 30,
|
||||
),
|
||||
],
|
||||
),
|
||||
Header(),
|
||||
const SizedBox(
|
||||
height: 15,
|
||||
),
|
||||
@@ -219,64 +172,6 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
);
|
||||
}
|
||||
|
||||
// Widget bannerview() {
|
||||
// return Consumer<ProductProvider>(builder: (context, provider, child)
|
||||
// {
|
||||
// if (provider.isBannerLoading) {
|
||||
// return Center(child: CircularProgressIndicator());
|
||||
// } else if (provider.banner.isEmpty) {
|
||||
// return Center(child: Text('No products available'));
|
||||
// } else {
|
||||
// return
|
||||
// Container(
|
||||
// height: 180,
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.greenAccent.withOpacity(0.1),
|
||||
// borderRadius: BorderRadius.circular(15)),
|
||||
// child: Stack(
|
||||
// children: [
|
||||
// Positioned(
|
||||
// top: 15,
|
||||
// left: 15,
|
||||
// child: SizedBox(
|
||||
// width: 200,
|
||||
// child: Text(
|
||||
// "World Food Festival, Bring the world to your Kitchen!",
|
||||
// style: context.customExtraBold(Colors.black, 18),
|
||||
// ))),
|
||||
// Positioned(
|
||||
// bottom: 15,
|
||||
// left: 15,
|
||||
// child: Container(
|
||||
// height: 40,
|
||||
// width: 100,
|
||||
// decoration: BoxDecoration(
|
||||
// color: APPCOLOR.lightGreen,
|
||||
// borderRadius: BorderRadius.circular(5),
|
||||
// ),
|
||||
// child: Center(
|
||||
// child: Text(
|
||||
// 'Shop now',
|
||||
// style: context.customRegular(Colors.white, 14),
|
||||
// )),
|
||||
// ),
|
||||
// ),
|
||||
// const Positioned(
|
||||
// right: 15,
|
||||
// bottom: 15,
|
||||
// child: AppNetworkImage(
|
||||
// height: 130,
|
||||
// width: 150,
|
||||
// imageUrl:
|
||||
// 'https://e7.pngegg.com/pngimages/742/816/png-clipart-coca-cola-can-illustration-coca-cola-soft-drink-surge-pepsi-coke-sweetness-cola-thumbnail.png',
|
||||
// backGroundColor: Colors.transparent))
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
Widget bestDeal() {
|
||||
return Consumer<ProductProvider>(builder: (context, provider, child) {
|
||||
if (provider.isBestdealingloading) {
|
||||
@@ -337,7 +232,28 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
Positioned(
|
||||
right: 5,
|
||||
top: 5,
|
||||
child: Icon(Icons.favorite_border),
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
if (await SharedPrefUtils.getToken() !=
|
||||
null)
|
||||
{
|
||||
provider.toggleWishlist(
|
||||
context, bestdealproduct.id!);
|
||||
} else {
|
||||
context.push(MyRoutes.LOGIN);
|
||||
}
|
||||
},
|
||||
child: Icon(
|
||||
provider.wishlist
|
||||
.contains(bestdealproduct.id)
|
||||
? Icons.favorite
|
||||
: Icons.favorite_border,
|
||||
color: provider.wishlist
|
||||
.contains(bestdealproduct.id)
|
||||
? Colors.red
|
||||
: Colors.grey,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,135 +1,17 @@
|
||||
// // import 'package:flutter/material.dart';
|
||||
// // import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
// // import 'package:geolocator/geolocator.dart';
|
||||
// // import 'package:geocoding/geocoding.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
// // class MapScreen extends StatefulWidget {
|
||||
// // @override
|
||||
// // _MapScreenState createState() => _MapScreenState();
|
||||
// // }
|
||||
|
||||
// // class _MapScreenState extends State<MapScreen> {
|
||||
// // late GoogleMapController mapController;
|
||||
// // LatLng _selectedLocation = LatLng(20.5937, 78.9629); // Default: India
|
||||
// // String _address = "Select a location";
|
||||
// // String _pincode = "";
|
||||
|
||||
// // @override
|
||||
// // void initState() {
|
||||
// // super.initState();
|
||||
// // _determinePosition();
|
||||
// // }
|
||||
|
||||
// // // Get current location
|
||||
// // Future<void> _determinePosition() async {
|
||||
// // LocationPermission permission = await Geolocator.requestPermission();
|
||||
// // if (permission == LocationPermission.denied) {
|
||||
// // return;
|
||||
// // }
|
||||
// // Position position = await Geolocator.getCurrentPosition();
|
||||
// // setState(() {
|
||||
// // _selectedLocation = LatLng(position.latitude, position.longitude);
|
||||
// // });
|
||||
// // _getAddressFromLatLng(position.latitude, position.longitude);
|
||||
// // }
|
||||
|
||||
// // // Get Address from LatLng
|
||||
// // Future<void> _getAddressFromLatLng(double lat, double lng) async {
|
||||
// // try {
|
||||
// // List<Placemark> placemarks = await placemarkFromCoordinates(lat, lng);
|
||||
// // Placemark place = placemarks[0];
|
||||
// // setState(() {
|
||||
// // _address =
|
||||
// // "${place.street}, ${place.locality}, ${place.administrativeArea}";
|
||||
// // _pincode = place.postalCode ?? "";
|
||||
// // });
|
||||
// // } catch (e) {
|
||||
// // print(e);
|
||||
// // }
|
||||
// // }
|
||||
|
||||
// // // On map tapped
|
||||
// // void _onMapTapped(LatLng tappedPoint)
|
||||
// // {
|
||||
// // setState(()
|
||||
// // {
|
||||
// // _selectedLocation = tappedPoint;
|
||||
// // });
|
||||
// // _getAddressFromLatLng(tappedPoint.latitude, tappedPoint.longitude);
|
||||
// // }
|
||||
|
||||
// // @override
|
||||
// // Widget build(BuildContext context) {
|
||||
// // return Scaffold(
|
||||
// // appBar: AppBar(title: Text("Pick Location")),
|
||||
// // body: Column(
|
||||
// // children: [
|
||||
// // Expanded(
|
||||
// // child: GoogleMap(
|
||||
// // initialCameraPosition: CameraPosition(
|
||||
// // target: _selectedLocation,
|
||||
// // zoom: 5,
|
||||
// // ),
|
||||
// // onMapCreated: (controller) {
|
||||
// // mapController = controller;
|
||||
// // },
|
||||
// // markers: {
|
||||
// // Marker(
|
||||
// // markerId: MarkerId("selectedLocation"),
|
||||
// // position: _selectedLocation,
|
||||
// // )
|
||||
// // },
|
||||
// // onTap: _onMapTapped,
|
||||
// // ),
|
||||
// // ),
|
||||
// // Container(
|
||||
// // padding: EdgeInsets.all(16),
|
||||
// // decoration: BoxDecoration(
|
||||
// // color: Colors.white,
|
||||
// // boxShadow: [BoxShadow(color: Colors.black12, blurRadius: 10)],
|
||||
// // ),
|
||||
// // child: Column(
|
||||
// // crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// // children: [
|
||||
// // Text("Selected Address:",
|
||||
// // style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
// // SizedBox(height: 5),
|
||||
// // Text(_address, style: TextStyle(fontSize: 16)),
|
||||
// // SizedBox(height: 10),
|
||||
// // TextField(
|
||||
// // decoration: InputDecoration(labelText: "Enter Pincode"),
|
||||
// // onChanged: (value) {
|
||||
// // setState(()
|
||||
// // {
|
||||
// // _pincode = value;
|
||||
// // });
|
||||
// // },
|
||||
// // ),
|
||||
// // SizedBox(height: 10),
|
||||
// // ElevatedButton(
|
||||
// // onPressed: ()
|
||||
// // {
|
||||
// // Navigator.pop(context,
|
||||
// // {
|
||||
// // "location": _selectedLocation,
|
||||
// // "address": _address,
|
||||
// // "pincode": _pincode
|
||||
// // });
|
||||
// // },
|
||||
// // child: Text("Confirm Location"),
|
||||
// // ),
|
||||
// // ],
|
||||
// // ),
|
||||
// // ),
|
||||
// // ],
|
||||
// // ),
|
||||
// // );
|
||||
// // }
|
||||
// // }
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:geocoding/geocoding.dart';
|
||||
import 'package:grocery_app/utils/constants/color_constant.dart';
|
||||
import 'package:grocery_app/utils/extensions/uicontext.dart';
|
||||
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
|
||||
const String googleApiKey = "AIzaSyAi3_Dls63iGs7Nccgdm-4FkS0rhT03-4U";
|
||||
|
||||
class MapScreen extends StatefulWidget {
|
||||
@override
|
||||
@@ -138,10 +20,15 @@ class MapScreen extends StatefulWidget {
|
||||
|
||||
class _MapScreenState extends State<MapScreen> {
|
||||
late GoogleMapController mapController;
|
||||
LatLng _selectedLocation = LatLng(20.5937, 78.9629); // Default: India
|
||||
String _address = "Fetching current location...";
|
||||
String _pincode = "";
|
||||
LatLng _selectedLocation = LatLng(20.5937, 78.9629);
|
||||
|
||||
TextEditingController _pincodeController = TextEditingController();
|
||||
TextEditingController _fullNameController = TextEditingController();
|
||||
TextEditingController _PhoneNumberController = TextEditingController();
|
||||
TextEditingController _addressTypeController = TextEditingController();
|
||||
TextEditingController _HouseNoController = TextEditingController();
|
||||
TextEditingController _RoadController = TextEditingController();
|
||||
TextEditingController _AlterNativeNumberController = TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -149,7 +36,6 @@ class _MapScreenState extends State<MapScreen> {
|
||||
_determinePosition();
|
||||
}
|
||||
|
||||
// Get current location
|
||||
Future<void> _determinePosition() async {
|
||||
bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
|
||||
if (!serviceEnabled) {
|
||||
@@ -162,7 +48,7 @@ class _MapScreenState extends State<MapScreen> {
|
||||
}
|
||||
|
||||
Position position = await Geolocator.getCurrentPosition(
|
||||
desiredAccuracy: LocationAccuracy.low,
|
||||
desiredAccuracy: LocationAccuracy.high,
|
||||
);
|
||||
LatLng currentLatLng = LatLng(position.latitude, position.longitude);
|
||||
|
||||
@@ -173,22 +59,59 @@ class _MapScreenState extends State<MapScreen> {
|
||||
_getAddressFromLatLng(position.latitude, position.longitude);
|
||||
}
|
||||
|
||||
// Get Address from LatLng
|
||||
Future<void> _getAddressFromLatLng(double lat, double lng) async {
|
||||
try {
|
||||
List<Placemark> placemarks = await placemarkFromCoordinates(lat, lng);
|
||||
Placemark place = placemarks.first;
|
||||
setState(() {
|
||||
_address =
|
||||
"${place.street}, ${place.locality}, ${place.administrativeArea}";
|
||||
_pincode = place.postalCode ?? "";
|
||||
_pincodeController.text = _pincode;
|
||||
final String url =
|
||||
"https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=$googleApiKey";
|
||||
|
||||
print(
|
||||
"jhsjhdfjdsgf ${place.street}, ${place.locality}, ${place.administrativeArea} ${place.postalCode} ${place.subLocality} ${place.name} ${place.subAdministrativeArea}");
|
||||
});
|
||||
try {
|
||||
final response = await http.get(Uri.parse(url));
|
||||
if (response.statusCode == 200) {
|
||||
final data = json.decode(response.body);
|
||||
if (data["status"] == "OK") {
|
||||
var result = data["results"][0]; // First result is most accurate
|
||||
|
||||
_RoadController.text = result["formatted_address"];
|
||||
List components = result["address_components"];
|
||||
|
||||
String roadName = "";
|
||||
String colony = "";
|
||||
String buildingName = "";
|
||||
String pincode = "";
|
||||
|
||||
for (var component in components) {
|
||||
List types = component["types"];
|
||||
if (types.contains("route")) {
|
||||
roadName = component["long_name"]; // Road Name
|
||||
} else if (types.contains("sublocality_level_1") ||
|
||||
types.contains("locality")) {
|
||||
colony = component["long_name"]; // Colony Name
|
||||
} else if (types.contains("premise") ||
|
||||
types.contains("street_number")) {
|
||||
buildingName = component["long_name"]; // Building Name
|
||||
} else if (types.contains("postal_code")) {
|
||||
pincode = component["long_name"]; // Extract Pin Code
|
||||
}
|
||||
}
|
||||
|
||||
// setState(() {
|
||||
// // _address = formattedAddress;
|
||||
// _roadName = roadName;
|
||||
// _colony = colony;
|
||||
// _buildingName = buildingName;
|
||||
// });
|
||||
|
||||
_pincodeController.text = pincode;
|
||||
_RoadController.text = result["formatted_address"];
|
||||
|
||||
print(
|
||||
"Full Address: ${result["formatted_address"]} ${response.body} sdfsgd ${pincode}");
|
||||
print("Road Name: $roadName");
|
||||
print("Colony: $colony");
|
||||
print("Building Name: $buildingName");
|
||||
} else {}
|
||||
} else {}
|
||||
} catch (e) {
|
||||
print(e);
|
||||
print("Error fetching address: $e");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,13 +145,26 @@ class _MapScreenState extends State<MapScreen> {
|
||||
}
|
||||
}
|
||||
|
||||
// {
|
||||
// "name": "Socket Mall",
|
||||
// "pincode": "400001",
|
||||
// "phoneNumber": "+919876543210",
|
||||
// "alternatePhoneNumber": "+919876543211",
|
||||
// "addressLine": "123, Main Street, Apartment 4B",
|
||||
// "landmark": "Near Central Park",
|
||||
// "addressType": "HOME",
|
||||
// "isDefault": false,
|
||||
// "additionalInstructions": "Please ring doorbell twice"
|
||||
// }
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text("Pick Location")),
|
||||
appBar: AppBar(title: Text("Add Delivery address")),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
Container(
|
||||
height: 200.h,
|
||||
child: GoogleMap(
|
||||
initialCameraPosition: CameraPosition(
|
||||
target: _selectedLocation,
|
||||
@@ -239,54 +175,152 @@ class _MapScreenState extends State<MapScreen> {
|
||||
},
|
||||
markers: {
|
||||
Marker(
|
||||
markerId: MarkerId("selectedLocation"),
|
||||
markerId: MarkerId("selected Location"),
|
||||
position: _selectedLocation,
|
||||
)
|
||||
},
|
||||
onTap: _onMapTapped,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
boxShadow: [BoxShadow(color: Colors.black12, blurRadius: 10)],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("Selected Address:",
|
||||
style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
SizedBox(height: 5),
|
||||
Text(_address, style: TextStyle(fontSize: 16)),
|
||||
SizedBox(height: 10),
|
||||
TextField(
|
||||
controller: _pincodeController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "Enter Pincode",
|
||||
border: OutlineInputBorder(),
|
||||
SingleChildScrollView(
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
boxShadow: [BoxShadow(color: Colors.black12, blurRadius: 10)],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// Text("Selected Address:",
|
||||
// style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
|
||||
// SizedBox(height: 5),
|
||||
// Text(_address, style: TextStyle(fontSize: 16)),
|
||||
SizedBox(height: 10),
|
||||
TextField(
|
||||
controller: _fullNameController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "Full Name (Required)*",
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (value) {},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_pincode = value;
|
||||
});
|
||||
},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context, {
|
||||
"location": _selectedLocation,
|
||||
"address": _address,
|
||||
"pincode": _pincode
|
||||
});
|
||||
},
|
||||
child: Text("Confirm Location"),
|
||||
),
|
||||
],
|
||||
SizedBox(height: 10),
|
||||
TextField(
|
||||
controller: _PhoneNumberController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "Phone Number (Required)*",
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (value) {},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _pincodeController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "Enter Pincode",
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (value) {},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _addressTypeController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "Address Type",
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (value) {},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
TextField(
|
||||
controller: _HouseNoController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "House No, Building Name (Required)*",
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (value) {},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
TextField(
|
||||
controller: _RoadController,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
labelText: "Road Name, Area , Colony(Required)*",
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (value) {},
|
||||
onSubmitted:
|
||||
_updateLocationFromPincode, // Auto-update on enter
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
InkWell(
|
||||
onTap: () {
|
||||
// print("fjnghkjfjghj");
|
||||
// Provider.of<ProductProvider>(context, listen: false)
|
||||
// .customerLogOut(context);
|
||||
},
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(
|
||||
left: 15, right: 15, top: 10, bottom: 10),
|
||||
height: 50,
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
decoration: BoxDecoration(
|
||||
color: APPCOLOR.lightGreen,
|
||||
borderRadius: BorderRadius.circular(10)),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(
|
||||
"Save Address",
|
||||
style: context.customMedium(Colors.white, 20),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
// ElevatedButton(
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context, {
|
||||
// "location": _selectedLocation,
|
||||
// "address": _address,
|
||||
// "pincode": _pincode
|
||||
// });
|
||||
// },
|
||||
// child: Text("Confirm Location"),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -294,143 +328,3 @@ class _MapScreenState extends State<MapScreen> {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// import 'dart:convert';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:geolocator/geolocator.dart';
|
||||
// import 'package:http/http.dart' as http;
|
||||
|
||||
// const String googleApiKey = "AIzaSyAi3_Dls63iGs7Nccgdm-4FkS0rhT03-4U"; // Replace with your API key
|
||||
|
||||
// class LocationScreen extends StatefulWidget {
|
||||
// @override
|
||||
// _LocationScreenState createState() => _LocationScreenState();
|
||||
// }
|
||||
|
||||
// class _LocationScreenState extends State<LocationScreen> {
|
||||
// String _address = "Fetching location...";
|
||||
// String _roadName = "";
|
||||
// String _colony = "";
|
||||
// String _buildingName = "";
|
||||
|
||||
// @override
|
||||
// void initState() {
|
||||
// super.initState();
|
||||
// _fetchCurrentLocation();
|
||||
// }
|
||||
|
||||
// // Fetch Current Location
|
||||
// Future<void> _fetchCurrentLocation() async {
|
||||
// try {
|
||||
// Position position = await Geolocator.getCurrentPosition(
|
||||
// desiredAccuracy: LocationAccuracy.bestForNavigation, // High Accuracy
|
||||
// );
|
||||
// _getAddressFromLatLng(position.latitude, position.longitude);
|
||||
// } catch (e) {
|
||||
// print("Error fetching location: $e");
|
||||
// setState(() {
|
||||
// _address = "Failed to get location.";
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
// // Get Address from Latitude and Longitude
|
||||
// Future<void> _getAddressFromLatLng(double lat, double lng) async {
|
||||
// final String url =
|
||||
// "https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=$googleApiKey";
|
||||
|
||||
// try {
|
||||
// final response = await http.get(Uri.parse(url));
|
||||
|
||||
// if (response.statusCode == 200) {
|
||||
// final data = json.decode(response.body);
|
||||
// if (data["status"] == "OK") {
|
||||
// var result = data["results"][0]; // First result is most accurate
|
||||
|
||||
// String formattedAddress = result["formatted_address"];
|
||||
// List components = result["address_components"];
|
||||
|
||||
// String roadName = "";
|
||||
// String colony = "";
|
||||
// String buildingName = "";
|
||||
|
||||
// for (var component in components) {
|
||||
// List types = component["types"];
|
||||
// if (types.contains("route")) {
|
||||
// roadName = component["long_name"]; // Road Name
|
||||
// } else if (types.contains("sublocality_level_1") || types.contains("locality")) {
|
||||
// colony = component["long_name"]; // Colony Name
|
||||
// } else if (types.contains("premise") || types.contains("street_number")) {
|
||||
// buildingName = component["long_name"]; // Building Name
|
||||
// }
|
||||
// }
|
||||
|
||||
// setState(() {
|
||||
// _address = formattedAddress;
|
||||
// _roadName = roadName;
|
||||
// _colony = colony;
|
||||
// _buildingName = buildingName;
|
||||
// });
|
||||
|
||||
// print("Full Address: $formattedAddress");
|
||||
// print("Road Name: $roadName");
|
||||
// print("Colony: $colony");
|
||||
// print("Building Name: $buildingName");
|
||||
// } else {
|
||||
// setState(() {
|
||||
// _address = "No address found";
|
||||
// });
|
||||
// }
|
||||
// } else {
|
||||
// setState(() {
|
||||
// _address = "Failed to fetch address";
|
||||
// });
|
||||
// }
|
||||
// } catch (e) {
|
||||
// print("Error fetching address: $e");
|
||||
// setState(() {
|
||||
// _address = "Error fetching address";
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return Scaffold(
|
||||
// appBar: AppBar(title: Text("Location Details")),
|
||||
// body: Padding(
|
||||
// padding: const EdgeInsets.all(16.0),
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// children: [
|
||||
// Text("Full Address:", style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
// Text(_address, style: TextStyle(fontSize: 16)),
|
||||
// SizedBox(height: 10),
|
||||
|
||||
// Text("Road Name:", style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
// Text(_roadName, style: TextStyle(fontSize: 16)),
|
||||
// SizedBox(height: 10),
|
||||
|
||||
// Text("Colony:", style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
// Text(_colony, style: TextStyle(fontSize: 16)),
|
||||
// SizedBox(height: 10),
|
||||
|
||||
// Text("Building Name:", style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
// Text(_buildingName, style: TextStyle(fontSize: 16)),
|
||||
// SizedBox(height: 20),
|
||||
|
||||
// ElevatedButton(
|
||||
// onPressed: _fetchCurrentLocation,
|
||||
// child: Text("Refresh Location"),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
Reference in New Issue
Block a user