import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/drawer/drawer_page.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/widgets/list_widget.dart'; import 'package:rogapp/widgets/map_widget.dart'; import 'package:rogapp/utils/location_controller.dart'; // index_page.dartファイルの主な内容です。 // このファイルは、アプリのメインページのUIを構築し、各機能へのナビゲーションを提供しています。 // また、IndexControllerとDestinationControllerを使用して、状態管理と各種機能の実装を行っています。 // // MapWidgetとListWidgetは、それぞれ別のファイルで定義されているウィジェットであり、マップモードとリストモードの表示を担当しています。 // // 全体的に、index_page.dartはアプリのメインページの構造を定義し、他のコンポーネントやページへの橋渡しを行っているファイルです。 // // 要検討:GPSデータの表示アイコンをタップした際のエラーハンドリングを追加することをお勧めします。 // MapWidgetとListWidgetの切り替えにObxを使用していますが、パフォーマンスを考慮して、必要な場合にのみウィジェットを再構築するようにしてください。 // DestinationControllerのisSimulationModeを使用してGPS信号の強弱をシミュレーションしていますが、本番環境では適切に実際のGPS信号を使用するようにしてください。 // IndexPageクラスは、GetViewを継承したStatelessWidgetです。このクラスは、アプリのメインページを表すウィジェットです。 // class IndexPage extends GetView { IndexPage({Key? key}) : super(key: key); // IndexControllerとDestinationControllerのインスタンスを取得しています。 // final LocationController locationController = Get.find(); final IndexController indexController = Get.find(); final DestinationController destinationController = Get.find(); // buildメソッドは、ウィジェットのUIを構築するメソッドです。 // ここでは、WillPopScopeウィジェットを使用して、端末の戻るボタンが押された際の動作を制御しています。 // @override Widget build(BuildContext context) { return PopScope( canPop: false, child: Scaffold( // // Scaffoldウィジェットを使用して、アプリのメインページのレイアウトを構築しています。 // drawer: DrawerPage(), appBar: AppBar( title: Text("add_location".tr), actions: [ // IconButton( // onPressed: () { // DatabaseService ds = DatabaseService(); // ds.updateDatabase(); // }, // icon: const Icon(Icons.ten_k_sharp)), // // AppBarには、タイトルとアクションアイコンが含まれています。 // アクションアイコンには、GPSデータの表示、履歴の表示、マップの更新、検索などの機能が含まれています。 // IconButton( onPressed: () async { // GpsDatabaseHelper db = GpsDatabaseHelper.instance; // List data = await db.getGPSData( // indexController.currentUser[0]["user"]['team_name'], // indexController.currentUser[0]["user"]["event_code"]); // print("GPS data is ${data.length}"); Get.toNamed(AppPages.GPS); }, icon: const Icon(Icons.telegram)), IconButton( onPressed: () { Get.toNamed(AppPages.HISTORY); }, icon: const Icon(Icons.history)), IconButton( onPressed: () { final tk = indexController.currentUser[0]["token"]; if (tk != null) { destinationController.fixMapBound(tk); } }, icon: const Icon(Icons.refresh)), InkWell( onTap: () { Get.toNamed(AppPages.SEARCH); }, child: Container( height: 32, width: 75, decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(25), ), child: const Center( child: Icon(Icons.search), ), ), ), //CatWidget(indexController: indexController,), // // デバッグ時のみリロードボタンの横にGPS信号レベルの設定ボタンを設置し、 // タップすることでGPS信号の強弱をシミュレーションできるようにする // Akira 2024-4-5 // Obx(() { if (locationController.isSimulationMode) { return DropdownButton( value: locationController.getSimulatedSignalStrength(), onChanged: (value) { //debugPrint("DropDown changed!"); locationController.setSimulatedSignalStrength(value!); }, items: ['low', 'medium', 'high', 'real'] .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), ); } else { return InkWell( onTap: () { locationController.setSimulatedSignalStrength('high'); }, child: const Icon(Icons.info), ); } }), /* Obx(() => locationController.isSimulationMode ? DropdownButton( value: locationController.getSimulatedSignalStrength(), onChanged: (value) { locationController.setSimulatedSignalStrength(value!); }, items: ['low', 'medium', 'high','real'] .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), ) : Container(), ), */ ], ), // bottomNavigationBar: BottomAppBar( // child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, // children: [ // Obx( // () => destinationController.isInRog.value == true // ? IconButton( // onPressed: () {}, // icon: const Icon( // Icons.run_circle, // size: 44, // color: Colors.green, // )) // : IconButton( // onPressed: () {}, // icon: const Icon( // Icons.run_circle, // size: 44, // color: Colors.black12, // )), // ), // Padding( // padding: // const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0), // child: InkWell( // child: Obx(() => destinationController // .isGpsSelected.value == // true // ? Padding( // padding: const EdgeInsets.only( // right: 10.0, top: 4.0, bottom: 4.0), // child: InkWell( // child: const Image( // image: // AssetImage('assets/images/route3_off.png'), // width: 35, // height: 35, // ), // onTap: () { // //indexController.switchPage(AppPages.TRAVEL); // }, // ), // ) // : Padding( // padding: const EdgeInsets.only( // right: 10.0, top: 4.0, bottom: 4.0), // child: InkWell( // child: const Image( // image: // AssetImage('assets/images/route2_on.png'), // width: 35, // height: 35, // ), // onTap: () { // //indexController.switchPage(AppPages.TRAVEL); // }, // ), // ))), // ), // ], // ), // ), // // マップモードとリストモードを切り替えるためのボタンです。 // floatingActionButton: FloatingActionButton( onPressed: () { indexController.toggleMode(); }, elevation: 1.0, // // Obxウィジェットを使用して、indexController.mode.valueの値に基づいて、MapWidgetまたはListWidgetを表示しています。 // child: Obx( () => indexController.mode.value == 0 ? const Image(image: AssetImage('assets/images/list2.png')) : const Image(image: AssetImage('assets/images/map.png')), ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, // // bodyには、SafeAreaウィジェットを使用して、画面の安全な領域内にUIを構築しています。 // body: SafeArea( child: Column( children: [ Expanded( child: Obx( () => indexController.mode.value == 0 ? MapWidget() : const ListWidget(), )) ], ), ), ), ); } }