タイマーを設定で変更できるようにした。現在地ボタンの長押しおよびドロワーへの設定ボタンの追加

This commit is contained in:
2024-04-26 18:44:22 +09:00
parent b9c641954d
commit 72267f29bb
9 changed files with 191 additions and 38 deletions

View File

@ -7,6 +7,8 @@ import 'package:get/get.dart';
//import 'package:vm_service/vm_service.dart';
//import 'package:dart_vm_info/dart_vm_info.dart';
import 'package:rogapp/pages/settings/settings_controller.dart';
import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/pages/index/index_binding.dart';
import 'package:rogapp/routes/app_pages.dart';
@ -78,6 +80,7 @@ void main() async {
//Get.put(LocationController());
// startMemoryMonitoring(); // 2024-4-8 Akira: メモリ使用量のチェックを開始 See #2810
Get.put(SettingsController()); // これを追加
runZonedGuarded(() {
runApp(const ProviderScope(child: MyApp()));

View File

@ -238,6 +238,15 @@ class DrawerPage extends StatelessWidget {
onTap: () {
_launchURL("https://rogaining.sumasen.net/api/privacy/");
},
),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('設定'),
onTap: () {
Get.back(); // ドロワーを閉じる
Get.toNamed(Routes.SETTINGS);
},
)
// ListTile(
// leading: const Icon(Icons.router),

View File

@ -0,0 +1,12 @@
// lib/pages/settings/settings_binding.dart
import 'package:get/get.dart';
import 'package:rogapp/pages/settings/settings_controller.dart';
class SettingsBinding extends Bindings {
@override
void dependencies() {
Get.put<SettingsController>(SettingsController()); // これを修正
//Get.lazyPut<SettingsController>(() => SettingsController());
}
}

View File

@ -0,0 +1,26 @@
// lib/pages/settings/settings_controller.dart
import 'package:get/get.dart';
import 'package:rogapp/widgets/map_widget.dart';
class SettingsController extends GetxController {
var timerDuration = Duration(seconds: 10).obs;
var autoReturnDisabled = false.obs;
final MapResetController mapResetController = Get.put(MapResetController());
void updateTimerDuration(int seconds) {
timerDuration.value = Duration(seconds: seconds);
}
void setAutoReturnDisabled(bool value) {
autoReturnDisabled.value = value;
if (!value) {
resetIdleTimer();
}
}
void resetIdleTimer() {
mapResetController.resetIdleTimer!();
}
}

View File

@ -0,0 +1,63 @@
// lib/pages/settings/settings_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rogapp/pages/settings/settings_controller.dart';
class SettingsPage extends GetView<SettingsController> {
const SettingsPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('設定'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'タイマーの長さ',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
Obx(
() => controller.autoReturnDisabled.value
? Container()
: Slider(
value: controller.timerDuration.value.inSeconds.toDouble(),
min: 5,
max: 30,
divisions: 5,
label: '${controller.timerDuration.value.inSeconds}',
onChanged: (value) {
controller.updateTimerDuration(value.toInt());
},
),
),
const SizedBox(height: 8),
const Text(
'マップ操作がなければ自動的に現在地に復帰します。そのタイマー秒数を入れて下さい。チェックボックスをチェックすると、自動復帰は行われなくなります。',
style: TextStyle(fontSize: 14),
),
const SizedBox(height: 16),
Obx(
() => CheckboxListTile(
title: const Text('自動復帰なし'),
value: controller.autoReturnDisabled.value,
onChanged: (value) {
controller.setAutoReturnDisabled(value!);
},
),
),
],
),
),
);
}
}

View File

@ -19,6 +19,8 @@ import 'package:rogapp/pages/progress/progress.dart';
import 'package:rogapp/pages/register/register_page.dart';
import 'package:rogapp/pages/search/search_binding.dart';
import 'package:rogapp/pages/search/search_page.dart';
import 'package:rogapp/pages/settings/settings_page.dart';
import 'package:rogapp/pages/settings/settings_binding.dart';
import 'package:rogapp/pages/subperf/subperf_page.dart';
import 'package:rogapp/spa/spa_binding.dart';
import 'package:rogapp/spa/spa_page.dart';
@ -48,6 +50,7 @@ class AppPages {
static const PROGRESS = Routes.PROGRESS;
static const HISTORY = Routes.HISTORY;
static const GPS = Routes.GPS;
static const SETTINGS = Routes.SETTINGS;
static final routes = [
GetPage(
@ -108,6 +111,11 @@ class AppPages {
GetPage(
name: Routes.GPS,
page: () => const GpsPage(),
),
GetPage(
name: Routes.SETTINGS,
page: () => const SettingsPage(),
binding: SettingsBinding(),
)
];
}

View File

@ -26,4 +26,5 @@ abstract class Routes {
static const PROGRESS = '/progress';
static const HISTORY = '/history';
static const GPS = '/gp';
static const SETTINGS = '/settings';
}

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/routes/app_pages.dart'; // これを追加
class CurrentPosition extends StatefulWidget {
const CurrentPosition({super.key});
@ -13,9 +14,16 @@ class _CurrentPositionState extends State<CurrentPosition> {
final DestinationController destinationController =
Get.find<DestinationController>();
void _onLongPress() {
Get.toNamed(AppPages.SETTINGS); // これを追加
}
@override
Widget build(BuildContext context) {
return Container(
return GestureDetector( // GestureDetectorを追加
onLongPress: _onLongPress, // 長押しイベントを追加
child: Container (
// return Container(
width: 40,
height: 40,
decoration: BoxDecoration(
@ -29,6 +37,7 @@ class _CurrentPositionState extends State<CurrentPosition> {
color: Colors.white,
),
),
),
);
}
}

View File

@ -6,6 +6,7 @@ import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:geojson_vi/geojson_vi.dart';
import 'package:get/get.dart';
import 'package:latlong2/latlong.dart';
import 'package:rogapp/pages/settings/settings_binding.dart';
import 'package:rogapp/model/destination.dart';
import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/pages/index/index_controller.dart';
@ -16,8 +17,13 @@ import 'package:rogapp/widgets/base_layer_widget.dart';
import 'package:rogapp/widgets/bottom_sheet_new.dart';
import 'package:rogapp/widgets/current_position_widget.dart';
import 'package:rogapp/widgets/game_state_view.dart';
import 'package:rogapp/pages/settings/settings_controller.dart';
import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart';
class MapResetController {
void Function()? resetIdleTimer;
}
class MapWidget extends StatefulWidget {
const MapWidget({Key? key}) : super(key: key);
@ -31,6 +37,7 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
final DestinationController destinationController =
Get.find<DestinationController>();
final LocationController locationController = Get.find<LocationController>();
final SettingsController settingsController = Get.find<SettingsController>();
late MapController mapController;
final Completer<MapController> mapControllerCompleter = Completer<MapController>();
@ -45,6 +52,7 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
SettingsBinding().dependencies(); // これを追加
_startIdleTimer();
mapController = MapController();
indexController.mapController = mapController;
@ -67,10 +75,19 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
});
});
late MapResetController mapResetController = MapResetController();
mapResetController.resetIdleTimer = _resetIdleTimer;
Get.put(mapResetController);
// indexController.mapController = MapController(initCompleter: mapControllerCompleter);
}
void _resetIdleTimer() {
_timer?.cancel();
_startIdleTimer();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this); // added
@ -90,7 +107,10 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
// _centerMapOnUser を10秒間でコール
void _startIdleTimer() {
_timer = Timer(const Duration(milliseconds: (1000 * 10)), _centerMapOnUser);
final settingsController = Get.find<SettingsController>();
if (!settingsController.autoReturnDisabled.value) {
_timer = Timer(settingsController.timerDuration.value, _centerMapOnUser);
}
}
// タイマーをリセットして_startIdleTimer をコール
@ -174,6 +194,7 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
// Widget getMarkerShape(GeoJSONFeature i, BuildContext context) {
Widget getMarkerShape(GeoJSONFeature i) {
/*
String labelText = TextUtils.getDisplayTextFeture(i);
if( i.properties!['cp'] == 0 ){
labelText="Start/Goal";
@ -184,10 +205,11 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
//}else{
// labelText=i.properties!['cp'];
}
*/
//if( i.properties!['cp'] <= 0 ) {
// debugPrint("Text=${labelText}");
//}
final double maxWidth = labelText.length * 16.0; //16.0;
//final double maxWidth = labelText.length * 16.0; //16.0;
GeoJSONMultiPoint p = i.geometry as GeoJSONMultiPoint;
return InkWell(
onTap: () {
@ -238,10 +260,9 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
Icons.circle,
size: 6.0,
),
i.properties!['cp'] <= 0
? Transform.translate
i.properties!['cp'] <= 0 ? Transform.translate
(
offset: const Offset(-3, 0),
offset: const Offset(-3, 0), //-3
child: Transform.rotate(
alignment: Alignment.centerLeft,
origin: Offset.fromDirection(1, 26),
@ -250,9 +271,9 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
Icons.play_arrow_outlined,
color: Colors.red,
size: 70,
),
),
)),
)
: Container(
color: Colors.transparent,
),
@ -262,42 +283,42 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
Transform.translate(
offset: const Offset(30, 0), // 30,0
child: Align(
alignment: Alignment.centerLeft,
alignment: Alignment.center,
child: Container (
//width: 200, // 幅を指定
//height: 60, // 40
color: Colors.transparent,
//child: Text(' ').
//constraints: const BoxConstraints(maxWidth: 1000.0), // 最大幅を設定
constraints: BoxConstraints(maxWidth: maxWidth), // 最大幅を設定
//constraints: BoxConstraints(maxWidth: maxWidth), // 最大幅を設定
//color: Colors.purple.withOpacity(0.2),
child: Stack(
children: <Widget>[
Text( // アウトライン
labelText,
TextUtils.getDisplayTextFeture(i),
style: TextStyle(
fontSize: 14, // 16
fontSize: 16, // 16
fontWeight: FontWeight.w700,
height: 1.2,
//height: 1.2,
foreground: Paint()
..style = PaintingStyle.stroke
..strokeWidth = 2
..color = Colors.white,
),
maxLines: 1, // テキストを1行に制限
softWrap: false, // テキストの折り返しを無効化
//maxLines: 1, // テキストを1行に制限
//softWrap: false, // テキストの折り返しを無効化
),
Text( // テキスト
labelText,
TextUtils.getDisplayTextFeture(i),
style: const TextStyle(
fontSize: 14,
fontSize: 16,
fontWeight: FontWeight.w700,
//fontWeight: FontWeight.bold,
height: 1.2,
//height: 1.2,
color: Colors.black,
),
maxLines: 1, // テキストを1行に制限
softWrap: false, // テキストの折り返しを無効化
//maxLines: 1, // テキストを1行に制限
//softWrap: false, // テキストの折り返しを無効化
),
],
),
@ -321,6 +342,7 @@ class _MapWidgetState extends State<MapWidget> with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
final settingsController = Get.find<SettingsController>(); // これを追加
//final PopupController popupController = PopupController();
return Stack(
children: [