i fail to display detail page with getx from homepage, anyone can help me? i want to go detail page, so i create argument on get.toNamed(...) before this i get lazyput or put, so it's wrong or no? i don't if it's wrong because i'm still new using getx, detail page using different url. it's my code:
detail_controller.dart
import 'package:get/get.dart';
import 'package:resto_app/app/models/detail_model.dart';
import 'package:resto_app/app/modules/home/controllers/home_controller.dart';
import 'package:resto_app/shared/constant/api_services.dart';
import 'package:resto_app/shared/services/base_client.dart';
class DetailController extends GetxController {
DetailController({required this.productDbId});
late final String productDbId;
RxBool isAwaitDetailProduct = false.obs;
Rx<DetailModel> detailProduct = DetailModel(
restaurant: Restaurant(
id: '',
name: '',
description: '',
city: '',
address: '',
pictureId: '',
categories: [],
menus: Menus(foods: [], drinks: []),
rating: 0,
customerReviews: [])).obs;
Future<void> getDetailResto(
{required String id, bool isUseLoading = true}) async {
if (isUseLoading) isAwaitDetailProduct.value = true;
var result = await BaseClient()
.get(baseUrl: ApiService.allResto, api: ApiService.detailPage + id);
if (result != null) detailProduct.value = DetailModel.fromJson(result);
isAwaitDetailProduct.value = false;
}
@override
Future<void> onInit() async {
// TODO: implement onInit
await getDetailResto(id: productDbId);
super.onInit();
}
}
detail_screen.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:resto_app/app/modules/detail/controllers/detail_controller.dart';
class DetailView extends StatelessWidget {
final DetailController _detailController =
Get.find<DetailController>(tag: Get.arguments as String);
@override
Widget build(BuildContext context) {
print(
" Ini hasilnyaaaa!!!${_detailController.detailProduct.value.restaurant.name}");
return Scaffold(
appBar: AppBar(),
body: Center(
child: Text(
'DetailView is working ${_detailController.detailProduct.value.restaurant.name}',
style: TextStyle(fontSize: 20),
),
),
);
}
}
home_screen.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:resto_app/shared/widget/article_item.dart';
import '../controllers/home_controller.dart';
class HomeView extends GetView<HomeController> {
@override
Widget build(BuildContext context) {
return controller.isLoadingAllProduct.value
? Center(
child: CupertinoActivityIndicator(
color: Colors.amber,
))
: Obx(() => Scaffold(
bottomNavigationBar: BottomNavigationBar(items: [
BottomNavigationBarItem(label: 'Home', icon: Icon(Icons.home)),
BottomNavigationBarItem(
label: 'Setting', icon: Icon(Icons.search)),
]),
body: GridView.builder(
itemCount: controller.allProduct.value.restaurants.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2),
itemBuilder: ((context, index) => ArticleItem(
resto: controller.allProduct.value.restaurants[index])))));
}
}
widget_home.dart
import 'package:flutter/material.dart';
import 'package:resto_app/app/models/resto_list.dart';
import 'package:get/get.dart';
import 'package:resto_app/app/modules/detail/controllers/detail_controller.dart';
import '../../app/routes/app_pages.dart';
class ArticleItem extends StatelessWidget {
ArticleItem({Key? key, required this.resto}) : super(key: key);
Restaurant resto;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(10),
child: Container(
child: Card(
borderOnForeground: true,
elevation: 10,
child: Expanded(
child: InkWell(
onLongPress: () async {
Get.lazyPut<DetailController>(
tag: '${resto.id}',
() => DetailController(productDbId: '${resto.id}'));
Get.toNamed(Routes.DETAIL, arguments: '${resto.id}');
},
child: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
padding: EdgeInsets.all(8),
child: ListView(
children: [
Wrap(
runSpacing: 10,
// runAlignment: WrapAlignment.start,
children: [
Image(
fit: BoxFit.cover,
image: NetworkImage(
'https://restaurant-api.dicoding.dev/images/large/${resto.pictureId}')),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Icon(
Icons.place,
size: 10,
),
const SizedBox(
width: 4,
),
Text(
resto.city,
style: Theme.of(context)
.textTheme
.labelLarge,
overflow: TextOverflow.clip,
),
],
),
Text(
resto.name,
style:
Theme.of(context).textTheme.labelSmall,
overflow: TextOverflow.clip,
),
],
),
),
Text(
"✭ - ${resto.rating}",
softWrap: true,
style: Theme.of(context).textTheme.bodySmall,
),
],
)
],
)
],
),
),
),
),
),
),
);
}
}
api_service.dart
class ApiService {
static const baseURL = 'https://restaurant-api.dicoding.dev';
static const allResto = '/list';
static const detailPage = '/detail/';
static const searchResto = '/search?q=fnfn8mytkpmkfw1e867';
}