REST API - FLUTTERs
REST API - FLUTTERs
dart';
import 'categories_model.dart';
int? id;
String? title;
int? price;
String? description;
CategoriesModel? category;
List<String>? images;
ProductsModel(
{this.id,
this.title,
this.price,
this.description,
this.category,
this.images});
id = json['id'];
title = json['title'];
price = json['price'];
description = json['description'];
? CategoriesModel.fromJson(json['category'])
: null;
images = json['images'].cast<String>();
}
// print("data ${productSnaphot[0]}");
return productSnaphot.map((data) {
return ProductsModel.fromJson(data);
}).toList();
}
// ignore: constant_identifier_names
import 'dart:developer';
import 'package:store_api_flutter_course/consts/api_consts.dart';
import 'package:store_api_flutter_course/models/categories_model.dart';
import 'package:store_api_flutter_course/models/products_model.dart';
import 'package:store_api_flutter_course/models/users_model.dart';
class APIHandler {
try {
BASE_URL,
"api/v1/$target",
target == "products"
?{
"offset": "0",
"limit": limit,
}
: {});
// print("response ${jsonDecode(response.body)}");
if (response.statusCode != 200) {
throw data["message"];
}
tempList.add(v);
// print("V $v \n\n");
}
return tempList;
} catch (error) {
throw error.toString();
}
}
target: "products",
limit: limit,
);
return ProductsModel.productsFromSnapshot(temp);
}
return CategoriesModel.categoriesFromSnapshot(temp);
}
return UsersModel.usersFromSnapshot(temp);
}
try {
// ignore: unrelated_type_equality_checks
// id == 88;
var uri = Uri.https(
BASE_URL,
"api/v1/products/$id",
);
// print("response ${jsonDecode(response.body)}");
if (response.statusCode != 200) {
throw data["message"];
}
return ProductsModel.fromJson(data);
} catch (error) {
throw error.toString();
}
}
}
import 'package:card_swiper/card_swiper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_iconly/flutter_iconly.dart';
import 'package:page_transition/page_transition.dart';
import 'package:store_api_flutter_course/consts/global_colors.dart';
import 'package:store_api_flutter_course/screens/categories_screen.dart';
import 'package:store_api_flutter_course/screens/feeds_screen.dart';
import 'package:store_api_flutter_course/screens/users_screen.dart';
import 'package:store_api_flutter_course/services/api_handler.dart';
import '../models/products_model.dart';
import '../widgets/appbar_icons.dart';
import '../widgets/feeds_grid.dart';
import '../widgets/sale_widget.dart';
@override
@override
void initState() {
_textEditingController = TextEditingController();
super.initState();
}
@override
void dispose() {
_textEditingController.dispose();
super.dispose();
}
@override
return GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: Scaffold(
appBar: AppBar(
// elevation: 4,
leading: AppBarIcons(
function: () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.fade,
),
);
},
icon: IconlyBold.category,
),
actions: [
AppBarIcons(
function: () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.fade,
),
);
},
icon: IconlyBold.user3,
),
],
),
body: Padding(
child: Column(
children: [
const SizedBox(
height: 18,
),
TextField(
controller: _textEditingController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Search",
filled: true,
fillColor: Theme.of(context).cardColor,
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide(
color: Theme.of(context).cardColor,
),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide(
width: 1,
color: Theme.of(context).colorScheme.secondary,
),
),
suffixIcon: Icon(
IconlyLight.search,
color: lightIconsColor,
)),
),
const SizedBox(
height: 18,
),
Expanded(
child: SingleChildScrollView(
child: Column(children: [
SizedBox(
child: Swiper(
itemCount: 3,
},
autoplay: true,
alignment: Alignment.bottomCenter,
builder: DotSwiperPaginationBuilder(
color: Colors.white,
activeColor: Colors.red)),
),
),
Padding(
child: Row(
children: [
const Text(
"Latest Products",
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 18,
),
),
const Spacer(),
AppBarIcons(
function: () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.fade,
},
icon: IconlyBold.arrowRight2),
],
),
),
FutureBuilder<List<ProductsModel>>(
if (snapshot.connectionState ==
ConnectionState.waiting) {
child: CircularProgressIndicator(),
);
} else if (snapshot.hasError) {
Center(
child:
);
const Center(
);
}
return FeedsGridWidget(
productsList: snapshot.data!);
}))
]),
),
)
],
),
)),
);
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/products_model.dart';
import 'feeds_widget.dart';
: super(key: key);
@override
return GridView.builder(
shrinkWrap: true,
itemCount: 5,
crossAxisCount: 2,
crossAxisSpacing: 0.0,
mainAxisSpacing: 0.0,
childAspectRatio: 0.6),
return ChangeNotifierProvider.value(
value: productsList[index],
);
});
}
}
import 'package:fancy_shimmer_image/fancy_shimmer_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_iconly/flutter_iconly.dart';
import 'package:page_transition/page_transition.dart';
import 'package:provider/provider.dart';
import 'package:store_api_flutter_course/models/products_model.dart';
import '../consts/global_colors.dart';
import '../screens/product_details.dart';
@override
return Padding(
child: Material(
borderRadius: BorderRadius.circular(8.0),
color: Theme.of(context).cardColor,
child: InkWell(
borderRadius: BorderRadius.circular(8.0),
onTap: () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.fade,
),
);
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
child: RichText(
text: TextSpan(
text: '\$',
children: <TextSpan>[
TextSpan(
text: "${productsModelProvider.price}",
style: TextStyle(
color: lightTextColor,
fontWeight: FontWeight.w600)),
]),
),
),
const Icon(IconlyBold.heart),
],
),
),
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: FancyShimmerImage(
width: double.infinity,
IconlyBold.danger,
color: Colors.red,
size: 28,
),
imageUrl: productsModelProvider.images![0],
boxFit: BoxFit.fill,
),
),
Padding(
child: Text(
productsModelProvider.title.toString(),
overflow: TextOverflow.ellipsis,
maxLines: 2,
fontSize: 17,
// fontFamily: 'Roboto',
fontWeight: FontWeight.w700,
),
),
),
SizedBox(
),
],
),
),
),
);
}