묻고 답해요
140만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
플러터 로컬 푸시 아이콘 질문있습니다.
import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:permission_handler/permission_handler.dart'; class FlutterLocalNotification { FlutterLocalNotification._(); static FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); static init() async { AndroidInitializationSettings androidInitializationSettings = const AndroidInitializationSettings('mipmap/ic_launcher'); InitializationSettings initializationSettings = InitializationSettings( android: androidInitializationSettings); await flutterLocalNotificationsPlugin.initialize(initializationSettings); } static Future<void> showNotification() async { const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('channel id', 'channel name', channelDescription: 'channel description', importance: Importance.max, priority: Priority.max, showWhen: false); const NotificationDetails notificationDetails = NotificationDetails( android: androidNotificationDetails, ); await flutterLocalNotificationsPlugin.show( 0, 'test title', 'test body', notificationDetails); //await flutterLocalNotificationsPlugin.cancel(0); 아이디가 0인 알람 삭제 } static Future<PermissionStatus> requestNotificationPermissions() async { final status = await Permission.notification.request(); return status; } } 다른 사람들 보면 아이콘도 같이 나오는데 저는 아이콘이 나오지 않아서 이렇게 질문드려요 어디가 이상한지 모르겠습니다.
-
해결됨
플러터 함수 실행에 대해 질문있습니다
/// 마커 터치 동작과 아이콘 수정 Future<Marker> Function(Cluster<Place>) _markerBuilder(BuildContext context) => (cluster) async { return Marker( markerId: MarkerId(cluster.getId()), position: cluster.location, onTap: () async { cluster.items.forEach((element) { log("${element.plcaeId.toString()}"); }); log("${context} 컨텍스트"); await locationWidgetUtil.buildShowModalBottomSheet(context!); }, icon: await _locationUtil.getMarkerBitmap( cluster.isMultiple ? 125 : 77, text: cluster.isMultiple ? cluster.count.toString() : null), ); }; /// 근처 플레이스 검색해서 마커 겹치는 정도 컨트롤 Future<void> initClusterManager(double lat, double lng) async { List<Place> placeCluster = await _locationUtil.nearSearchPlace(LatLng(lat, lng)); log("${placeCluster.length} 길이입니다."); _clusterManager = ClusterManager<Place>(placeCluster, _updateMarkers, markerBuilder: _markerBuilder(_context!), levels: const [1, 4.25, 6.75, 8.25, 11, 14, 16, 17, 20.0]); log("${_clusterManager!.items.length}아이템 길이이므니다"); notifyListeners(); } /// 겹치는 마커 안겹치는 마커 다시 그리는 용도 void _updateMarkers(Set<Marker> markers) { _markerList = markers; notifyListeners(); }var pl = Provider.of<LocationNotifier>(context,listen: false); await pl.getPosition(); pl.setContext(context); await pl.initClusterManager(pl.current.latitude,pl.current.longitude);아래 코드에서 pl.initClusterManager를 실행하면 정상적으로 _markerBuilder가 잘 실행되면서 다음 페이지로 넘어가는데 다시 pl.initClusterManager를 호출하면 _markerBuilder에 로그를 넣어보니 로그가 아예 실행이 안되는데 처음할 때는 실행이 되는데 한 번 더 입력하면 실행이 안되는지 이유를 모르겠습니다. 위에 코드는 Provider쪽 파일입니다.
-
해결됨
플러터 StreamProvider 중지에 대해 질문있습니다.
버튼 클릭시 trackingOff()를 호출해서 중지시킬려고 해도 StreamProvider가 중지가 되지않아서 그러는데 StreamProvider는 중지 시킬 수 없나여?class LocationUtil { late UserLocation userLocation; late Position _currentPosition; late LocationPermission checkPermission; StreamSubscription<Position>? positionStream; Geolocator geolocator = Geolocator(); StreamController<UserLocation> _positionController = StreamController<UserLocation>(); Stream<UserLocation> get locationStream => _positionController.stream; final LocationSettings locationSettings = LocationSettings(accuracy: LocationAccuracy.high); // 추적 버튼 클릭시에만 현재 위치 주기적으로 업데이트 LocationUtil() { // 사용자의 현재 위치 계속 업데이트해주기 positionStream = Geolocator.getPositionStream(locationSettings: locationSettings) .listen((location) { _positionController .add(UserLocation(location.latitude, location.longitude)); }); } Future<UserLocation> getCurrentLocation() async { try { final isLocationEnabled = await Geolocator.isLocationServiceEnabled(); checkPermission = await Geolocator.checkPermission(); log("${isLocationEnabled} isLocationEnabled 확인"); // 권한이 없을때 if (!isLocationEnabled) { log("${checkPermission} checkPermission 확인"); // 권한 설정 확인 if (checkPermission == LocationPermission.denied || checkPermission == LocationPermission.deniedForever) { checkPermission = await Geolocator.requestPermission(); } // 한번더 권한 취소햇으면 if (checkPermission == LocationPermission.denied || checkPermission == LocationPermission.deniedForever) { throw Exception("denied'"); } } else if (isLocationEnabled && (checkPermission == LocationPermission.always || checkPermission == LocationPermission.whileInUse)) { _currentPosition = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); userLocation = UserLocation(_currentPosition.latitude, _currentPosition.longitude); } } catch (e) { log("${e} 경복궁 보여줍시다."); userLocation = UserLocation(37.579887, 126.976870); } log("${userLocation.latitude},${userLocation.longitude} 현재 위치 위도 경도"); return userLocation; } void closePosition() { if (positionStream != null) { log("종료입니다"); positionStream!.cancel(); _positionController.close(); positionStream = null; } else {} } void trackingOn(){ positionStream!.resume(); _positionController.onResume; } void trackingOff(){ log("off입니다."); positionStream!.pause(); _positionController.onPause; log("${positionStream!.isPaused}"); } } StreamProvider<UserLocation>( initialData: Provider.of<LocationNotifier>(context).userLocation, create: (context) => LocationUtil().locationStream, child: Consumer<LocationNotifier>( builder: (context, locationNotifier, _) { CameraPosition initialCameraPosition = CameraPosition( target: LatLng(Provider.of<UserLocation>(context).latitude, Provider.of<UserLocation>(context).longitude), zoom: 18); log("반복하는지 테스트입니다!!!!"); animatedViewofMap( lat: Provider.of<UserLocation>(context).latitude, lng: Provider.of<UserLocation>(context).longitude, zoom: null); return Stack(children: [ GoogleMap( initialCameraPosition: initialCameraPosition, myLocationEnabled: true, mapToolbarEnabled: true, myLocationButtonEnabled: true, mapType: MapType.normal, onMapCreated: (GoogleMapController controller) { _controller.complete(controller); }, markers: markerList, ), ]); }), )
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
mac m2에서 안드로이드 스튜디오로 외장 ssd에 플젝 만들고 안드로이드 실행할대 에러
상황은 맥북 (m2)에서 안드로이드 스튜디오를 사용하여 안드로이드 에뮬레이터를 작동하려 할 때 밑과 같은 에러가 생깁니다. 다만 제가 외장 ssd에 프로젝트를 생성하고 실행을 해서 그런게 아닌가 싶습니다. 재밌게도 ios 시뮬레이터는 정상적으로 돌아갑니다.. 어떻게 고치나요? * What went wrong: Gradle could not start your build. > Could not create service of type FileHasher using BuildSessionServices.createFileHasher(). > Timeout waiting to lock file hash cache (/Volumes/T7/FlutterPj/statefullreal/android/.gradle/7.4/fileHashes). It is currently in use by this Gradle process.Owner Operation: unknown Our operation: Lock file: /Volumes/T7/FlutterPj/statefullreal/android/.gradle/7.4/fileHashes/fileHashes.lock
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
플러터 aab 빌드 오류
오류 Error: Cannot run with sound null safety, because the following dependencies don't support null safety: - package:flutter_swiper - package:flutter_page_indicator - package:transformer_page_view For solutions, see https://dart.dev/go/unsound-null-safety 빌드를 하면 이렇게 나옵니다. 안드로이드스튜디오 => RUN=> EDIT CONFIGURATIONS... => additional run args: --no-sound-null-safety 이미 적혀 있습니다 . 그래도 오류가 발생하는데 어떻게 해결해야하나요?
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
LoginPage에서 _handleSignIn()메서드 호출
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. LoginPage에서 _handleSignIn()메서드 호출하고 TabPage로 이동하는 코드가 없는데 어떻게 이동하게 되는건지 알고싶습니다.
-
미해결Flutter + Firebase로 넷플릭스 UI 클론 코딩하기 [무작정 플러터]
기기별 찜하기 기능 표시
안녕하세요! 정말 수준높은 강의 잘 들었습니다! 이런 좋은 강의 무료로 해주신 게 감사해서 유투브도 구독 좋아요했습니다~ 제가 해당 강의를 따라하면서 정말 정말 꼭 알고 싶은 게 하나 있어서 글을 남깁니다! 해당 강의의 많은 부분을 따라하면서 코로나 바이러스 단계별 행동지침을 나타내는 영어로 번역한 앱을 만들고 있습니다! 처음으로 만드는 앱이여서 막히는 부분이 있을때마다 이 강의를 보면서 비슷한 기능들을 클론 코딩하고 싶습니다! 다만 태뽕님의 코딩을 따라하면 '한 기기당 개별적인 찜리스트'가 아니라 '모두가 공유하는 찜리스트'가 하나 생깁니다! 저는 각각의 사용자가 자주 사용하는 도시들을 찜하기 할 수 있는 기능을 구상하고 있습니다! 혹시 이렇게 하려면 어떤 방향으로 수정해야 하는 지 알 수 있을까요? 만약 좀 많은 작업이 필요하다면 혹시 메일 드려도 괜찮을까요?