How to fetch method getx to detail page?

Viewed 108

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';
}
0 Answers
Related