From c5ac4edffdbccccdcb6da98658beb1df116ffb65 Mon Sep 17 00:00:00 2001 From: Jungwoo <108061510+jwson-automation@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:17:13 +0900 Subject: [PATCH] fix sendMessageScreen --- lib/core/TopScreen.dart | 5 +- lib/feature/map/PoliceMapScreen.dart | 170 +++++++++--------- lib/feature/map/widget/SendMessageWidget.dart | 58 ------ lib/feature/send/SendMessageScreen.dart | 43 +++++ .../send/provider/messageIndexProvider.dart | 20 +++ .../send/widget/SendMessageButton.dart | 49 +++++ .../send/widget/SendMessagePreview.dart | 34 ++++ .../SendMessagePreviewChangeButton.dart | 25 +++ 8 files changed, 259 insertions(+), 145 deletions(-) delete mode 100644 lib/feature/map/widget/SendMessageWidget.dart create mode 100644 lib/feature/send/SendMessageScreen.dart create mode 100644 lib/feature/send/provider/messageIndexProvider.dart create mode 100644 lib/feature/send/widget/SendMessageButton.dart create mode 100644 lib/feature/send/widget/SendMessagePreview.dart create mode 100644 lib/feature/send/widget/SendMessagePreviewChangeButton.dart diff --git a/lib/core/TopScreen.dart b/lib/core/TopScreen.dart index f23e4d0..7dd5394 100644 --- a/lib/core/TopScreen.dart +++ b/lib/core/TopScreen.dart @@ -1,5 +1,6 @@ import 'package:blueberry_flutter_template/feature/map/PoliceMapScreen.dart'; import 'package:blueberry_flutter_template/feature/mypage/MyPageScreen.dart'; +import 'package:blueberry_flutter_template/feature/send/SendMessageScreen.dart'; import 'package:blueberry_flutter_template/feature/voiceOutput/VoiceOutputScreen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -23,8 +24,8 @@ class TopScreen extends ConsumerWidget { final selectedIndex = ref.watch(selectedIndexProvider); final List pages = [ - VoiceOutputScreen(), - const PoliceMapScreen(), + const VoiceOutputScreen(), + const SendMessageScreen(), const MyPageScreen(), ]; diff --git a/lib/feature/map/PoliceMapScreen.dart b/lib/feature/map/PoliceMapScreen.dart index bb506c4..9518efe 100644 --- a/lib/feature/map/PoliceMapScreen.dart +++ b/lib/feature/map/PoliceMapScreen.dart @@ -1,85 +1,85 @@ -import 'dart:async'; - -import 'package:blueberry_flutter_template/feature/map/provider/LocationProvider.dart'; -import 'package:blueberry_flutter_template/feature/map/provider/PermissionProvider.dart'; -import 'package:blueberry_flutter_template/feature/map/provider/PoliceStationProvider.dart'; -import 'package:blueberry_flutter_template/feature/map/widget/SendMessageWidget.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; - -class PoliceMapScreen extends ConsumerStatefulWidget { - const PoliceMapScreen({super.key}); - - @override - _PoliceMapScreenState createState() => _PoliceMapScreenState(); -} - -class _PoliceMapScreenState extends ConsumerState { - final Completer _googleMapControllerCompleter = - Completer(); - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - _checkPermission(); - } - - Future _checkPermission() async { - await ref.read(permissionProvider.notifier).checkPermission(); - } - - @override - Widget build(BuildContext context) { - final permissionStatus = ref.watch(permissionProvider); - final locationState = ref.watch(locationProvider); - final policeStationsAsyncValue = - ref.watch(policeStationsProvider(locationState)); - - return Scaffold( - body: () { - if (permissionStatus == LocationPermissionStatus.initial) { - return const Center(child: CircularProgressIndicator()); - } else if (permissionStatus == LocationPermissionStatus.granted) { - return SafeArea( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // Expanded( - // child: policeStationsAsyncValue.when( - // data: (policeStations) => GoogleMapWidget( - // googleMapControllerCompleter: - // _googleMapControllerCompleter, - // locationState: locationState, - // policeStationsAsyncValue: policeStationsAsyncValue, - // ), - // loading: () => - // const Center(child: CircularProgressIndicator()), - // error: (error, stack) => - // Center(child: Text('Error: $error')), - // ), - // ), - const SizedBox(height: 8), - // Expanded( - // child: PoliceStationListWidget( - // googleMapControllerCompleter: - // _googleMapControllerCompleter, - // locationState: locationState, - // policeStationsAsyncValue: policeStationsAsyncValue, - // ), - // ), - Center(child: SendMessage(locationState: locationState)), - ], - ), - ), - ); - } - // else { - // return PermissionDeniedWidget(permissionStatus: permissionStatus); - // } - }(), - ); - } -} +// import 'dart:async'; +// +// import 'package:blueberry_flutter_template/feature/map/provider/LocationProvider.dart'; +// import 'package:blueberry_flutter_template/feature/map/provider/PermissionProvider.dart'; +// import 'package:blueberry_flutter_template/feature/map/provider/PoliceStationProvider.dart'; +// import 'package:blueberry_flutter_template/feature/map/widget/GoogleMapWidget.dart'; +// import 'package:blueberry_flutter_template/feature/map/widget/PoliceStationListWidget.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_riverpod/flutter_riverpod.dart'; +// import 'package:google_maps_flutter/google_maps_flutter.dart'; +// +// class PoliceMapScreen extends ConsumerStatefulWidget { +// const PoliceMapScreen({super.key}); +// +// @override +// _PoliceMapScreenState createState() => _PoliceMapScreenState(); +// } +// +// class _PoliceMapScreenState extends ConsumerState { +// final Completer _googleMapControllerCompleter = +// Completer(); +// +// @override +// void didChangeDependencies() { +// super.didChangeDependencies(); +// _checkPermission(); +// } +// +// Future _checkPermission() async { +// await ref.read(permissionProvider.notifier).checkPermission(); +// } +// +// @override +// Widget build(BuildContext context) { +// final permissionStatus = ref.watch(permissionProvider); +// final locationState = ref.watch(locationProvider); +// final policeStationsAsyncValue = +// ref.watch(policeStationsProvider(locationState)); +// +// return Scaffold( +// body: () { +// if (permissionStatus == LocationPermissionStatus.initial) { +// return const Center(child: CircularProgressIndicator()); +// } else if (permissionStatus == LocationPermissionStatus.granted) { +// return SafeArea( +// child: Padding( +// padding: const EdgeInsets.all(8.0), +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Expanded( +// child: policeStationsAsyncValue.when( +// data: (policeStations) => GoogleMapWidget( +// googleMapControllerCompleter: +// _googleMapControllerCompleter, +// locationState: locationState, +// policeStationsAsyncValue: policeStationsAsyncValue, +// ), +// loading: () => +// const Center(child: CircularProgressIndicator()), +// error: (error, stack) => +// Center(child: Text('Error: $error')), +// ), +// ), +// const SizedBox(height: 8), +// Expanded( +// child: PoliceStationListWidget( +// googleMapControllerCompleter: +// _googleMapControllerCompleter, +// locationState: locationState, +// policeStationsAsyncValue: policeStationsAsyncValue, +// ), +// ), +// ], +// ), +// ), +// ); +// } +// // else { +// // return PermissionDeniedWidget(permissionStatus: permissionStatus); +// // } +// }(), +// ); +// } +// } diff --git a/lib/feature/map/widget/SendMessageWidget.dart b/lib/feature/map/widget/SendMessageWidget.dart deleted file mode 100644 index 09887fe..0000000 --- a/lib/feature/map/widget/SendMessageWidget.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:blueberry_flutter_template/utils/AppStrings.dart'; -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class SendMessage extends StatelessWidget { - final LatLng locationState; - - const SendMessage({ - super.key, - required this.locationState, - }); - - @override - Widget build(BuildContext context) { - final String message = - '[메세지] 위급상황이 발생했습니다. 도와주세요!\n (위도: ${locationState.latitude} / 경도: ${locationState.longitude})'; - - return Container( - height: 100, - width: double.infinity, - decoration: BoxDecoration( - border: Border.all(width: 1), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text(message), - ElevatedButton( - onPressed: () async { - final Uri smsUri = Uri( - scheme: 'sms', - path: '112', - queryParameters: { - 'body': message, - }, - ); - - if (await canLaunchUrl(smsUri)) { - await launchUrl(smsUri); - } else { - showDialog( - context: context, - builder: (BuildContext context) { - return const AlertDialog( - content: Text(AppStrings.errorMessage_sendFailed), - ); - }, - ); - } - }, - child: const Text(AppStrings.button_sendMessage), - ), - ], - ), - ); - } -} diff --git a/lib/feature/send/SendMessageScreen.dart b/lib/feature/send/SendMessageScreen.dart new file mode 100644 index 0000000..ddb1934 --- /dev/null +++ b/lib/feature/send/SendMessageScreen.dart @@ -0,0 +1,43 @@ +import 'package:blueberry_flutter_template/feature/send/widget/SendMessageButton.dart'; +import 'package:blueberry_flutter_template/feature/send/widget/SendMessagePreview.dart'; +import 'package:blueberry_flutter_template/feature/send/widget/SendMessagePreviewChangeButton.dart'; +import 'package:blueberry_flutter_template/utils/AppTextStyle.dart'; +import 'package:flutter/material.dart'; + +class SendMessageScreen extends StatelessWidget { + const SendMessageScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: const Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded(flex: 1, child: SendMessageTitleText()), + Expanded(flex: 4, child: SendMessagePreview()), + Expanded(flex: 1, child: SendMessagePreviewChangeButton()), + Expanded( + flex: 5, + child: SendMessageButton(), + ) + ], + ), + ), + ); + } +} + +class SendMessageTitleText extends StatelessWidget { + const SendMessageTitleText({super.key}); + + @override + Widget build(BuildContext context) { + return const Text( + '경찰서에 문자하기', + style: black24TextStyle, + ); + } +} + diff --git a/lib/feature/send/provider/messageIndexProvider.dart b/lib/feature/send/provider/messageIndexProvider.dart new file mode 100644 index 0000000..d74175c --- /dev/null +++ b/lib/feature/send/provider/messageIndexProvider.dart @@ -0,0 +1,20 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class MessageIndexNotifier extends StateNotifier { + MessageIndexNotifier() : super(0); + + void changeIndex() { + state = (state + 1) % messages.length; + } +} + +final messageIndexProvider = + StateNotifierProvider((ref) { + return MessageIndexNotifier(); +}); + +final messages = [ + '이상한 사람이\n따라오고 있어요.\n도와주세요.', + '수상한 사람이 있어요 \n도와주세요.', + '취해서 난동을 부리는 사람이 있어요 \n도와주세요.' +]; diff --git a/lib/feature/send/widget/SendMessageButton.dart b/lib/feature/send/widget/SendMessageButton.dart new file mode 100644 index 0000000..7d0adb7 --- /dev/null +++ b/lib/feature/send/widget/SendMessageButton.dart @@ -0,0 +1,49 @@ +import 'package:blueberry_flutter_template/feature/send/provider/messageIndexProvider.dart'; +import 'package:blueberry_flutter_template/utils/AppStrings.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class SendMessageButton extends ConsumerWidget { + const SendMessageButton({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final index = ref.watch(messageIndexProvider); + return CircleAvatar( + backgroundColor: Colors.black, + radius: 50, + child: IconButton( + onPressed: () async { + final Uri smsUri = Uri( + scheme: 'sms', + path: '112', + queryParameters: { + 'body': messages[index], + }, + ); + + if (await canLaunchUrl(smsUri)) { + await launchUrl(smsUri); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return const AlertDialog( + content: Text(AppStrings.errorMessage_sendFailed), + ); + }, + ); + } + }, + icon: const Icon(Icons.send), + // 마이크 아이콘 + iconSize: 50, + // 아이콘 크기 + color: Colors.white, + // 아이콘 색상 + splashRadius: 30, // 클릭 반경 + ), + ); + } +} diff --git a/lib/feature/send/widget/SendMessagePreview.dart b/lib/feature/send/widget/SendMessagePreview.dart new file mode 100644 index 0000000..04ce102 --- /dev/null +++ b/lib/feature/send/widget/SendMessagePreview.dart @@ -0,0 +1,34 @@ +import 'package:blueberry_flutter_template/feature/send/provider/messageIndexProvider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class SendMessagePreview extends ConsumerWidget { + const SendMessagePreview({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final index = ref.watch(messageIndexProvider); + final notifier = ref.watch(messageIndexProvider.notifier); + // 카테고리 데이터를 리스트로 정의 + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 60.0), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + messages[index], + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 60), + + ], + ), + ), + ); + } +} diff --git a/lib/feature/send/widget/SendMessagePreviewChangeButton.dart b/lib/feature/send/widget/SendMessagePreviewChangeButton.dart new file mode 100644 index 0000000..4d48b6b --- /dev/null +++ b/lib/feature/send/widget/SendMessagePreviewChangeButton.dart @@ -0,0 +1,25 @@ +import 'package:blueberry_flutter_template/feature/send/provider/messageIndexProvider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class SendMessagePreviewChangeButton extends ConsumerWidget { + const SendMessagePreviewChangeButton({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final notifier = ref.watch(messageIndexProvider.notifier); + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + icon: const Icon(Icons.refresh, size: 30.0), + onPressed: () { + notifier.changeIndex(); + // 텍스트 변경 + }, + ), + Text('메시지 텍스트 변경하기', style: TextStyle(fontSize: 24.0)), + ], + ); + } +}