Hello i’m new to flutter, i want to make a feature when i pressed "add to cart button" i want to pass data from current Page (Example : PsuListPage) and display it on ListTile and replace the default value of title with the data of product based on id product on WishListPage. How to do it?
ApiPsu
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:http/http.dart' as http;
import '/model/psu_model.dart';
class ApiPsu {
static const String url = 'http://192.168.251.119:3000/psu';
static Future<List<PsuModel>> getPsu() async {
final response = await Dio().get(url);
print('response: $response');
if (response.statusCode == 200) {
final List<dynamic> data = response.data;
final List<PsuModel> psu =
data.map<PsuModel>((json) => PsuModel.fromJson(json)).toList();
return psu;
} else {
throw Exception('Failed to load data');
}
}
}
PsuModel
Note : I use only title product, id, image, price, rating
import 'dart:convert';
List<PsuModel> psuModelFromJson(String str) =>
List<PsuModel>.from(json.decode(str).map((x) => PsuModel.fromJson(x)));
String psuModelToJson(List<PsuModel> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class PsuModel {
PsuModel({
required this.id,
required this.title,
required this.asin,
required this.link,
required this.categories,
required this.image,
this.amazonsChoice,
this.isPrime,
required this.rating,
required this.ratingsTotal,
required this.price,
this.bestseller,
this.isSmallBusiness,
this.isCarousel,
this.carousel,
this.availability,
this.coupon,
});
int id;
String title;
String asin;
String link;
List<Category> categories;
String image;
AmazonsChoice? amazonsChoice;
bool? isPrime;
double? rating;
int? ratingsTotal;
Price price;
Bestseller? bestseller;
bool? isSmallBusiness;
bool? isCarousel;
Carousel? carousel;
Availability? availability;
Coupon? coupon;
factory PsuModel.fromJson(Map<String, dynamic> json) => PsuModel(
id: json["id"],
title: json["title"],
asin: json["asin"],
link: json["link"],
categories: List<Category>.from(
json["categories"].map((x) => Category.fromJson(x))),
image: json["image"],
amazonsChoice: json["amazons_choice"] == null
? null
: AmazonsChoice.fromJson(json["amazons_choice"]),
isPrime: json["is_prime"],
rating: json["rating"]?.toDouble(),
ratingsTotal: json["ratings_total"],
price: Price.fromJson(json["price"]),
bestseller: json["bestseller"] == null
? null
: Bestseller.fromJson(json["bestseller"]),
isSmallBusiness: json["is_small_business"],
isCarousel: json["is_carousel"],
carousel: json["carousel"] == null
? null
: Carousel.fromJson(json["carousel"]),
availability: json["availability"] == null
? null
: Availability.fromJson(json["availability"]),
coupon: json["coupon"] == null ? null : Coupon.fromJson(json["coupon"]),
);
Map<String, dynamic> toJson() => {
"id": id,
"title": title,
"asin": asin,
"link": link,
"categories": List<dynamic>.from(categories.map((x) => x.toJson())),
"image": image,
"amazons_choice": amazonsChoice?.toJson(),
"is_prime": isPrime,
"rating": rating,
"ratings_total": ratingsTotal,
"price": price.toJson(),
"bestseller": bestseller?.toJson(),
"is_small_business": isSmallBusiness,
"is_carousel": isCarousel,
"carousel": carousel?.toJson(),
"availability": availability?.toJson(),
"coupon": coupon?.toJson(),
};
}
class AmazonsChoice {
AmazonsChoice({
required this.link,
required this.keywords,
});
String link;
String keywords;
factory AmazonsChoice.fromJson(Map<String, dynamic> json) => AmazonsChoice(
link: json["link"],
keywords: json["keywords"],
);
Map<String, dynamic> toJson() => {
"link": link,
"keywords": keywords,
};
}
class Availability {
Availability({
required this.raw,
});
String raw;
factory Availability.fromJson(Map<String, dynamic> json) => Availability(
raw: json["raw"],
);
Map<String, dynamic> toJson() => {
"raw": raw,
};
}
class Bestseller {
Bestseller({
required this.link,
required this.category,
});
String link;
String category;
factory Bestseller.fromJson(Map<String, dynamic> json) => Bestseller(
link: json["link"],
category: json["category"],
);
Map<String, dynamic> toJson() => {
"link": link,
"category": category,
};
}
class Carousel {
Carousel({
required this.title,
required this.subTitle,
required this.id,
});
String title;
String subTitle;
String id;
factory Carousel.fromJson(Map<String, dynamic> json) => Carousel(
title: json["title"],
subTitle: json["sub_title"],
id: json["id"],
);
Map<String, dynamic> toJson() => {
"title": title,
"sub_title": subTitle,
"id": id,
};
}
class Category {
Category({
required this.name,
required this.id,
});
Name name;
Id id;
factory Category.fromJson(Map<String, dynamic> json) => Category(
name: nameValues.map[json["name"]] ?? Name.ALL_DEPARTMENTS,
id: idValues.map[json["id"]] ?? Id.APS,
);
Map<String, dynamic> toJson() => {
"name": nameValues.reverse[name],
"id": idValues.reverse[id],
};
}
enum Id { APS }
final idValues = EnumValues({"aps": Id.APS});
enum Name { ALL_DEPARTMENTS }
final nameValues = EnumValues({"All Departments": Name.ALL_DEPARTMENTS});
class Coupon {
Coupon({
required this.badgeText,
required this.text,
});
String badgeText;
String text;
factory Coupon.fromJson(Map<String, dynamic> json) => Coupon(
badgeText: json["badge_text"],
text: json["text"],
);
Map<String, dynamic> toJson() => {
"badge_text": badgeText,
"text": text,
};
}
class Price {
Price({
this.symbol,
this.value,
this.currency,
required this.raw,
this.name,
this.isPrimary,
this.asin,
this.link,
});
Symbol? symbol;
double? value;
Currency? currency;
String raw;
String? name;
bool? isPrimary;
String? asin;
String? link;
factory Price.fromJson(Map<String, dynamic> json) => Price(
symbol: symbolValues.map[json["symbol"]] ?? Symbol.EMPTY,
value: json["value"]?.toDouble(),
currency: currencyValues.map[json["currency"]] ?? Currency.USD,
raw: json["raw"],
name: json["name"],
isPrimary: json["is_primary"],
asin: json["asin"],
link: json["link"],
);
Map<String, dynamic> toJson() => {
"symbol": symbolValues.reverse[symbol],
"value": value,
"currency": currencyValues.reverse[currency],
"raw": raw,
"name": name,
"is_primary": isPrimary,
"asin": asin,
"link": link,
};
}
enum Currency { USD }
final currencyValues = EnumValues({"USD": Currency.USD});
enum Symbol { EMPTY }
final symbolValues = EnumValues({"u0024": Symbol.EMPTY});
class EnumValues<T> {
Map<String, T> map;
late Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
reverseMap = map.map((k, v) => MapEntry(v, k));
return reverseMap;
}
}
PsuProvider
import 'package:flutter/material.dart';
import '../api/psu_api.dart';
import '../model/psu_model.dart';
enum RequestState { empty, loading, loaded, error }
class PsuProvider extends ChangeNotifier {
RequestState _state = RequestState.empty;
RequestState get state => _state;
List<PsuModel> _psu = [];
List<PsuModel> get psu => _psu;
String _message = '';
String get message => _message;
Future<void> fetchPsu() async {
_state = RequestState.loading;
notifyListeners();
try {
final result = await ApiPsu.getPsu();
_psu = result;
_state = RequestState.loaded;
notifyListeners();
} catch (e) {
_state = RequestState.error;
_message = e.toString();
notifyListeners();
}
}
}
PsuListPage
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '/view_model/psu_provider.dart';
class PsuListPage extends StatefulWidget {
const PsuListPage({super.key});
@override
State<PsuListPage> createState() => _PsuListPageState();
}
class _PsuListPageState extends State<PsuListPage> {
@override
void initState() {
// TODO: implement initState
super.initState();
Future.microtask(
() => Provider.of<PsuProvider>(context, listen: false).fetchPsu());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('MandorPC'),
),
body: Consumer<PsuProvider>(builder: (context, psu, child) {
if (psu.state == RequestState.loading) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (psu.state == RequestState.loaded) {
return ListView.builder(
itemCount: psu.psu.length,
itemBuilder: (context, index) {
return Card(
shape: const RoundedRectangleBorder(
side: BorderSide(color: Colors.blue),
borderRadius: BorderRadius.all(Radius.circular(10))),
child: InkWell(
onTap: () {},
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
Text(
psu.psu[index].title,
textAlign: TextAlign.justify,
),
Image.network(psu.psu[index].image),
Text(
'Rating : ${psu.psu[index].rating ?? 'No rating yet'}'),
Text(
'Total Rating : ${psu.psu[index].ratingsTotal ?? 'No rating yet'}'),
Text('USD ${psu.psu[index].price.value}'),
],
),
),
ElevatedButton(
onPressed: () {
Navigator.pop(context, psu.psu[index].id);
},
child: const Text('Add to Cart'))
],
),
));
});
} else if (psu.state == RequestState.error) {
return Center(
child: Text(psu.message),
);
} else {
return const Center(
child: Text('Silakan klik tombol add untuk memulai'),
);
}
}),
);
}
}
WishListPage
import 'package:flutter/material.dart';
import 'package:mini_project_mandor_pc/view/case_list_page.dart';
import 'package:mini_project_mandor_pc/view/cpu_cooler_page.dart';
import 'package:mini_project_mandor_pc/view/gpu_list_page.dart';
import 'package:mini_project_mandor_pc/view/motherboard_list_page.dart';
import 'package:mini_project_mandor_pc/view/psu_list_page.dart';
import 'package:mini_project_mandor_pc/view/ram_list_page.dart';
import 'package:mini_project_mandor_pc/view/storage_list_page.dart';
import 'package:mini_project_mandor_pc/view_model/gpu_provider.dart';
import 'package:mini_project_mandor_pc/view_model/psu_provider.dart';
import 'package:mini_project_mandor_pc/view_model/ram_provider.dart';
import 'package:mini_project_mandor_pc/view_model/storage_provider.dart';
import 'package:provider/provider.dart';
import '../view_model/case_provider.dart';
import '../view_model/cpu_cooler_provider.dart';
import '../view_model/cpu_provider.dart';
import '../view_model/motherboard_provider.dart';
import 'cpu_list_page.dart';
class WishListPage extends StatefulWidget {
const WishListPage({super.key});
@override
State<WishListPage> createState() => _WishListPageState();
}
class _WishListPageState extends State<WishListPage> {
List<String> _list = [
'CPU',
'GPU',
'Motherboard',
'RAM',
'Storage',
'PSU',
'Case',
'CPU Cooler'
];
@override
void initState() {
// TODO: implement initState
super.initState();
Future.microtask(
() => Provider.of<GpuProvider>(context, listen: false).fetchGpu());
Future.microtask(
() => Provider.of<MoboProvider>(context, listen: false).fetchMobo());
Future.microtask(
() => Provider.of<PsuProvider>(context, listen: false).fetchPsu());
Future.microtask(
() => Provider.of<RamProvider>(context, listen: false).fetchRam());
Future.microtask(() =>
Provider.of<StorageProvider>(context, listen: false).fetchStorage());
Future.microtask(
() => Provider.of<CpuProvider>(context, listen: false).fetchCpu());
Future.microtask(() =>
Provider.of<CpuCoolerProvider>(context, listen: false).fetchCooler());
Future.microtask(
() => Provider.of<CaseProvider>(context, listen: false).fetchCasing());
}
@override
Widget build(BuildContext context) {
final psuId = ModalRoute.of(context)?.settings.arguments as String;
final psu = Provider.of<PsuProvider>(context, listen: false)
.psu
.firstWhere((element) => element.id == psuId);
return Scaffold(
appBar: AppBar(
title: const Text('MandorPC'),
),
body: ListView.builder(
itemCount: 8,
itemBuilder: (context, index) {
return Card(
child: InkWell(
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) {
switch (index) {
case 1:
return const GpuListPage();
case 2:
return const MoboListPage();
case 3:
return const RamListPage();
case 4:
return const StorageListPage();
case 5:
return const PsuListPage();
case 6:
return const CaseListPage();
case 7:
return const CpuCoolerListPage();
default:
return const CpuListPage();
}
}));
},
child: ListTile(
title: Text('Masukkan ${_list[index]}'),
),
),
);
}));
}
}
i tried the navigator.pop(context,psu.psu[index].id)
but i don’t know what i have to do next
2
Answers
I think you can use a callback after navigator.pop the current page, here are some examples, I have first page, so this page will get data from second page,
for doing that you could use pop abilities
if you take closer look to its implementation you would find out you could pass optionally positioned parameter on it .
for getting data you had pop with you could await on it like this
then for passing data back you could do this