#FLUTTER
62024.12.08
인플루언서 
하이제니스
8,082IT테크 전문블로거
참여 콘텐츠 89
플러터(Flutter) FFI를 활용한 SerialPort 사용 예제 코드(윈도우, 리눅스)

플러터에서 네이티브 기능을 사용하려면 이미 만들어진 패키지를 이용하거나 FFI를 활용한다. FFI는 안드로이드의 NDK와 비슷한 기능을 한다고 보면될 것 같다. 실제 사용 법도 JNI와 매우 비슷하다. 아래 프로젝트는 FFI를 활요한 방법이다. GitHub - dong-higenis/flutter_serial_example_window_linux_ffi Contribute to dong-higenis/flutter_serial_example_window_linux_ffi development by creating an account on GitHub. github.com 해당 프로젝트는 윈도우 시리얼포트(com port)를 열기/ 닫기/ 쓰기/ 읽기/ COM포트 리스트얻기 기능이 구현되어있다. 리눅스버전은 아직 미완성이고 윈도우쪽만 참고하길바란다. #플러터 #flutter #ffi #dll사용

2024.07.21
2
ESP32S3-ETH-CAN485 UDP 테스트 윈도우 프로그램 추가(플러터/파이썬 소스 코드 포함)

https://github.com/dong-higenis/esp32s3_eth-can485 GitHub - dong-higenis/esp32s3_eth-can485 Contribute to dong-higenis/esp32s3_eth-can485 development by creating an account on GitHub. github.com 윈도우용 UDP Test 프로그램을 추가하였다. 동일한 기능을하는 두 가지 버전인데 플러터(Flutter)과 파이썬(PySide6)으로 작성되었다. 왼쪽: 플러터, 오른쪽: 파이썬 ESP32S3 ETH-CAN485 구입하기 ESP32S3 ETH-CAN485 YD-ESP32S3 8MB 개발보드 : 하이제니스 [하이제니스] 하이제니스 상점입니다. smartstore.naver.com

2024.07.20
2
플러터(Flutter) iOS Target Version 설정하기

아... 오랜만에 업데이트 릴리스 하려니 빌드에서 문제가 많이 발생한다. Target version이 범위를 벗어났다는 경고이고 실제 해당 경고가 빌드에 영향을 미치고 있었다. Automatically signing iOS for device deployment using specified development team in Xcode project: 3NULR3J76K Running pod install... 5.7s Running Xcode build... Xcode archive done. 15.7s Failed to build iOS app Error output from Xcode build: ↳ 2024-01-08 20:59:41.109 xcodebuild[10697:81086] DVTPortal: Service '<DVTPortalViewDeveloperService: 0x73012110; action='viewDeveloper'>' encountered an unexpected result code from the portal ('1100') 2024-01-08 20:59:41.109 xcodebuild[10697:81086] DVTPortal: Error: Error Domain=DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in...

2024.01.09
pecs satisfying the `Firebase/Messaging (= 10.3.0), Firebase/Messaging (= 10.18.0)` dependency were

플러터(Flutter)에서 iOS 빌드를 하려는데 아래와 같은 에러가 발생하였다. Pre-downloading: `MultiplatformBleAdapter` from `https://github.com/below/MultiPlatformBleAdapter`, tag `0.1.9` firebase_core: Using Firebase SDK version '10.18.0' defined in 'firebase_core' Warning: firebase_app_id_file.json file does not exist. This may cause issues in upload-symbols. If this error is unexpected, try running flutterfire configure again. firebase_crashlytics: Using Firebase SDK version '10.18.0' defined in 'firebase_core' firebase_messaging: Using Firebase SDK version '10.18.0' defined in 'firebase_core' [!] CocoaPods could not find compatible versions for pod "Firebase/Messaging": In snapshot (Podfile.lock): Firebase/Messaging ...

2024.01.08
플러터(Flutter) - AWS IoT Core 연 예제 코드 MQTT

mqtt_client | Dart Package A server and browser based MQTT client for Dart supporting normal, secure sockets and websockets. pub.dev 아래의 예제 코드는 mqtt_client 패키지를 이용한 AWS IoT Core 예제이다. class Config { static const String awsRootCA = "-----BEGIN CERTIFICATE-----\nMIIDQTCCAxxxxxxxxxxxxITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVK...

2023.12.07
3
android.permission.ACCESS_COARSE_LOCATION 권한 선언이 maxSdkVersion만 다를 뿐 중복됩니다.

구글 플레이 스토어 콘솔에서 앱을 업로드 시 아래와 같은 오류가 발생하였다면... androidManifest.xml에서 android.permission.ACCESS_COARSE_LOCATION 퍼미션 추가 때 최대 SDK 버전 제한(maxSdkVersion)을 걸어주면 된다. 단순히 maxSdkVersion으로 제한을 걸면 상위버전 폰에서 퍼미션 체크를 아예 못하는 문제가 발생한다. androidManifext.xml에서 uses-permission-sdk-23을 추가해 API 23이상에 대해서 추가 퍼미션을 지정해주면 된다. android.permission.ACCESS_COARSE_LOCATION뿐만이 아니라 ACCESS_FINE_LOCATION를 쓰고 있다면 이 녀석도 발생할 테니 같이 추가해 주면 된다. #플러터 미워.... 아니지 #안드로이드 미운 거지 https://github.com/dariuszseweryn/RxAndroidBle#permissions https://developer.android.com/guide/topics/connectivity/bluetooth/permissions https://github.com/dariuszseweryn/RxAndroidBle/issues/215 https://stackoverflow.com/questions/44299197/google-play-apk-upload-err...

2023.03.21
Could not find method useProguard() for arguments [true]

좀 지난 플러터 앱을 최신 빌드(Gradle 버전 7.0.0 이상) 시스템에서 빌드 하려는데 아래와 같은 에러가 발생하였다. Build file '/Users/dong/work/flutter_prj/........../android/app/build.gradle' line: 77 A problem occurred evaluating project ':app'. > Could not find method useProguard() for arguments [true] on BuildType$AgpDecorated_Decorated{name=release, debuggable=false, Build file '/Users/dong/work/flutter_prj/......./android/app/build.gradle' line: 77 A problem occurred evaluating project ':app'. > Could not find method useProguard() for arguments [true] on BuildType$AgpDecorated_Decorated{name=release, debuggable=false, 좀 찾아보니 더 이상 난독화를 위해 build.gradle 파일에 useProguard 설정을 할 필요가 없다는 것이었다. 해당 설정이 포함되면 문제가 되는 것이다. 아래와 같이 useProguard 항...

2023.03.21
6
이 App Bundle 아티팩트 유형은 네이티브 코드를 포함하며 아직 디버그 기호가 업로드되지 않았습니다. 비정상 종료 및 ANR....

이 App Bundle 아티팩트 유형은 네이티브 코드를 포함하며 아직 디버그 기호가 업로드되지 않았습니다. 비정상 종료 및 ANR을 더 쉽게 분석하고 디버그할 수 있도록 기호 파일을 업로드하는 것이 좋습니다. 탐색기로 아래의 위치로 이동한다. [플러터 프로젝터]\build\app\intermediates\merged_native_libs\release\out\lib 그리고 거기에 보이는 폴더들을 한꺼번에 압축하자. 이름은 크게 중요하지 않다. 이제 이것을 구글 콘솔에 업로드해 주면 된다. 구글 콘솔에서 해당 프로젝트로 이동 후 왼쪽 메뉴 중 App Bindle 탐색기를 실행한다. 릴리스할 버전 오른쪽 끝에 있는 화살표를 클릭하자. 그다음 다운로드 탭을 클릭 후 네이티브 디버그 기호 오른쪽에 있는 [업로드 화살표]를 클릭하자. 위와 같이 팝업이 나타나면 아까 압축한 파일을 여기에 넣어주면 된다.

2023.03.04
황당한 ADB 에러 cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037

플러터(Flutter) 개발에 주로 쓰는 macOS를 업그레이드하면서 그동안 윈도우 OS에서 빌드를 해보려는데 뭔가 잘 안되었다. 먼전 flutter doctor -v 로 상태를 확인해 보니 아래와 같은 에러가 발생하였다. X Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues. X Exception: Unable to run "adb", check your Android SDK installation and ANDROID_SDK_ROOT environment variable: d:/Android/Sdk\platform-tools\adb.exe #1 AndroidDevices.pollingGetDevices (package:flutter_tools/src/android/android_device_discovery.dart:75:7) <asynchronous suspension> <asynchronous suspension> #3 Future.wait.<anonymous closure> (dart:async/future.dart:521:21) <asynchronous suspe...

2023.03.03
하.. 오랫만에 플러터 릴리즈하려니 힘들구만...

플러터로 만든 앱을 거의 반년 만에 기능 추가 및 개선 후 스토어에 올리려니 그새 뭐가 또 요구사항들이 늘어나 쉽게 올라가질 않느다. 그냥 최신 버전으로 올리고 패키지들 문제점들 찾아 잡고..... 그래야 할 것 같다. 아놔 ㅜㅜ 플러터 버전 올라가는 게 너무 빨라....

2023.03.03
플러터(Flutter) 문자열에 포함된 Null 값 제거 방법

외부로부터 데이터를 받는데 분명 "11100000032_BL" 와 같은 데이터를 받았는데 실제 출력해 보면 "111"만 표시되는 것이다. 문제는 브레이크 포인트를 걸어 변수를 확인해 보면 문제가 없이 "11100000032_BL"로 표시된다. 그래서 일단 해당 값을 바이트 리스트로 변환해 확인해 보니 아래와 같이 중간에 Null(널, 0) 값이 포함되어 있는 것을 확인할 수 있었다. 그래서 문자열 출력 시 널 이전까지만 표시되는 것이었다. [49, 49, 49, 0, 48, 48, 48, 48, 48, 48, 51, 50, 95, 66, 76] 이렇게 중간에 널이 껴있는 문자열 변수에서 널을 제거한 완벽한 문자열로 만드는 방법은 다음과 같다. List<int> tmp = []; foundName.codeUnits.forEach((element) { if (element != 0) tmp.add(element); }); foundName = utf8.decode(tmp); 위 코드는 문자열을 바이트로 바꿔 반복문으로 널이 아닌 값만 찾아 tmp에 담은 후 다시 문자열로 바꾸는 코드이다..... 이 코드를 조금 간단하게 만들어보면 다음과 같이 정규 표현식을 이용해 널 값만 찾아 제거할 수도 있다. foundName = foundName.replaceAll(RegExp('\\0'), '');

2023.02.24
플러터(Flutter) - BLE 통신하기(블루투스 저전력) 5. 데이터 받기 flutter_blue_plus

목차 1. 검색(scan) 편 2. 특정 장치만 검색(Scan) 편 3. 연결 및 연결 해제 편 4. 서비스 정보 얻기 5. 데이터 받기 지난번에 서비스와 캐릭터리스틱 정보(Discovery Service)를 얻는 것까지 진행하였다. 이번엔 장치에서 보내는 데이터를 받는 방법을 다뤄 볼 것이다. 여기서 다루는 코드를 실행한 환경은 다음과 같다. flutter sdk: 3.0.5 dart 2.17.6 flutter_blue_plus: 1.3.0 android compile sdk: 31 android kotlin version: 1.7.10 android gradle version: com.android.tools.build:gradle:7.1.0 1. 동작 영상 2. 소스코드 위치 flutter_ble_scan_example/example_5 at main · dong-higenis/flutter_ble_scan_example flutter_ble_scan_example. Contribute to dong-higenis/flutter_ble_scan_example development by creating an account on GitHub. github.com 3. 소스코드 리뷰 main.dart main.dart의 코드는 [4. 서비스 정보 얻기] 편과 동일하니 패스! device_screen.dart device_screen....

2022.08.19
플러터(Flutter) - BLE 통신하기(블루투스 저전력) 4. 서비스 정보 얻기 flutter_blue_plus

목차 1. 검색(scan) 편 2. 특정 장치만 검색(Scan) 편 3. 연결 및 연결 해제 편 4. 서비스 정보 얻기 5. 데이터 받기 이전 글 이후로 상당히 오랜만에 이어 쓰는 것 같다. 그 와중에 flutter_blue 패키지의 지원이 멈췄고 찾아보니 어떤 고마우신 분이 flutter_blue_plus라는 패키지로 이어받아 관리를 하고 있는 것이었다. 다행히 패키지와 메인 클래스명만 수정해 주면 그대로 쓸 수 있으니 큰 어려움을 없을 것이다. 여기서 다루는 코드를 실행한 환경은 다음과 같다. flutter sdk: 3.0.5 dart 2.17.6 flutter_blue_plus: 1.3.0 android compile sdk: 31 android kotlin version: 1.7.10 android gradle version: com.android.tools.build:gradle:7.1.0 1. 동작 영상 2. 소스코드 위치 flutter_ble_scan_example/example_4 at main · dong-higenis/flutter_ble_scan_example flutter_ble_scan_example. Contribute to dong-higenis/flutter_ble_scan_example development by creating an account on GitHub. github.com 3. 소스코드 리...

2022.08.17
10
플러터(Flutter) 버전 변경하기(다운그레이드) - 윈도우

플러터(Flutter) SDK를 최신 버전이 아닌 예전 버전으로 변경하는 방법이다. T.M.I 시작 플러터는 하위 버전으로 변경하는 명령이 존재했다가 사라진 것 같다. 항상 최신 버전만 설치하길 원하지만 아직 불안전한 플러터는 버전 업 될 때마다 아주 획기적(?)으로 바꿔놔 기존 코드를 무용지물로 만들 때가 종종 있다. 가장 좋은 것은 기존 코드를 최신 버전에 맞게 수정하는 것이지만 그게 여의치 않을 땐 플러터 버전을 하위 버전으로 변경하는 것도 좋은 방법이라 생각한다. 플러터 버전을 바꾸는 것은 git을 이용하는 방법도 있는데 이것보다 내 개인적으론 지금 설명하려는 방법이 편한 것 같다. T.M.I 끝~ 설치 방법을 요약하면 다음과 같다. 1. 플러터 SDK Release 사이트에서 원하는 버전에 원하는 채널(Stable?, beta?)을 골라 다운로드해 압축을 해제 해놓는다. 2. 현재 설치되어 있는 플러터의 위치를 파악한다. 3. 현재 설치된 플러터 위치로 이동해 혹시 모르니 기존 버전을 이름만 바꿔 놓고 다운로드한 플러터를 이동시킨다. 4. 플러터 의사(?)에게 진단을 받아 문제없는지 확인한다. 자 그럼 시작해 보자. 여기서는 현재 2.2.2@stable이 설치된 것을 2.8.0@stable 버전으로 변경할 것이다. 이것을 참고해 자신이 원하는 버전으로 변경할 수 있을 것이다. 참고로 플러터 버전 확인은 파워쉘(Powershe...

2022.04.27
3
플러터(Flutter) - 시리얼 통신 - 윈도우버전 예제 코드 링크

플러터(Flutter) 윈도우 앱에서 간단한 시리얼 통신을 예제를 만들어 봤다 GitHub - dong-higenis/flutter_libserialport_simple_example: A simple example of using libserialport for Windows in Flutter. A simple example of using libserialport for Windows in Flutter. - GitHub - dong-higenis/flutter_libserialport_simple_example: A simple example of using libserialport for Windows in Flutter. github.com 테스트 환경 flutter: 2.10.2 dart: 2.16.1 동작 환경: 윈도우 10 추가된 라이브러리 flutter_libserialport, cp949 flutter_libserialport: ^0.2.3 cp949: git: url: https://github.com/dong-higenis/dart-cp949 ref: main 코드 설명은 나중에...

2022.02.22
2
플러터(Flutter) - cp949 패키지 널-세이프티(null safety) 적용

플러터 윈도우 앱 개발에서 libserialport를 사용하다 보니 한글이 깨지는 문제가 발생하였다. cp949 | Dart Package CP949 Encoder/Decoder pub.dev 좀 찾아보니 인코딩(EUC-KR) 문제였고 위 패키지를 이용해 인코딩하면 된다고 한다. 그런데 해당 패키지에 null safety가 적용되지 않아 코드를 보니 그리 복잡하지 않아 간단하게 null safety를 적용시킬 수 있었다. 아래의 코드는 원본 소스코드의 링크이다. GitHub - jjangga0214/dart-cp949: Decode or encode CP949 (EUC-KR inclusive) in Dart. Decode or encode CP949 (EUC-KR inclusive) in Dart. - GitHub - jjangga0214/dart-cp949: Decode or encode CP949 (EUC-KR inclusive) in Dart. github.com 그리고 위 해당 프로젝트를 가져와 null safety를 적용한 소스코드의 위치는 다음과 같다. https://github.com/dong-higenis/dart-cp949 GitHub - dong-higenis/dart-cp949: Decode or encode CP949 (EUC-KR inclusive) in Dart. Decode or encode CP949 (E...

2022.02.21
6
플러터(Flutter) - Please enable Developer Mode in your system settings

flutter_libserialport | Flutter Package A simple wrapper around libserialport utilizing Flutter's build system to build and deploy the C-library for the target platform. pub.dev 플러터 윈도우 앱에서 시리얼 통신 테스트를 위해 flutter_libserialport라는 라이브러리를 패키지에 추가하여 실행하니까 아래와 같은 에러가 발생하였다. Exception: Building with plugins requires symlink support. Please enable Developer Mode in your system settings. Run start ms-settings:developers to open settings. 개발자 모드를 활성화해야 한다고 한다. 명령어 창에서 아래와 같이 입력하거나 start ms-settings:developers 윈도우 시작 버튼 > 설정 > 업데이트 및 보안 > 개발자용 을 차례로 선택한다. 개발자용 설정 화면이 나타나면 개발자 모드를 끔에서 켬으로 변경하자. 뭐 보안 어쩌고저쩌고 하는데 예를 눌러 활성화하면 된다. 이제 다시 플러터를 빌드 해보면 잘 되는 것을 볼 수 있을 것이다.

2022.02.21
플러터(Flutter) - BLE 통신하기(블루투스 저전력) 2. 특정 장치만 검색(Scan) 편 flutter_blue

목차 1. 검색(scan) 편 2. 특정 장치만 검색(Scan) 편 3. 연결 및 연결 해제 편 4. 서비스 정보 얻기 5. 데이터 받기 소스코드 위치 flutter_ble_scan_example/example_2 at main · dong-higenis/flutter_ble_scan_example flutter_ble_scan_example. Contribute to dong-higenis/flutter_ble_scan_example development by creating an account on GitHub. github.com 아래의 코드는 이전 검색 편에서 살짝만 응용해 특정 장치명만 리스트에 표시하는 기능을 추가하였다. import 'package:flutter/material.dart'; import 'package:flutter_blue/flutter_blue.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { final title = 'Flutter BLE Scan Demo'; @override Widget build(BuildContext context) { return MaterialApp( title: title, home: MyHomePage(title: title), ); } } class MyHomePage extend...

2021.12.08
12
플러터(Flutter) cmdline-tools component is missing

데스크톱 PC를 새로 맞추고 플러터를 설치하는데 아래와 같은 오류가 발생하였다. PS C:\Users\donggyu> flutter doctor Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, 2.5.2, on Microsoft Windows [Version 10.0.19043.1237], locale ko-KR) [X] Android toolchain - develop for Android devices X cmdline-tools component is missing Run `path/to/sdkmanager --install "cmdline-tools;latest"` See https://developer.android.com/studio/command-line for more details. [√] Chrome - develop for the web [√] Android Studio (version 2020.3) [√] VS Code (version 1.60.2) [√] Connected device (2 available) 분명 안드로이드 스튜디오에 cmdline-tools이 잘 설치되어 있는데도 오류는 사라지지 않는 것이었다. 안드로이드 스튜디오 설정화면 구글링을 해보니 아래와 같은 답변을 확인할 수 있었다. ht...

2021.10.01
3
Flutter_ble_lib iOS 15 빌드 에러

Users/dong/work/flutter_prj/app/homssen/ios/Pods/MultiplatformBleAdapter/iOS/RxSwift/Platform/DataStructures/Bag.swift:176:9: warning: 'Hashable.hashValue' is deprecated as a protocol requirement; conform type 'BagKey' to 'Hashable' by implementing 'hash(into:)' instead var hashValue: Int { ^ /Users/dong/work/flutter_prj/app/homssen/ios/Pods/MultiplatformBleAdapter/iOS/RxBluetoothKit/BluetoothManager.swift:161:65: warning: 'index(where:)' is deprecated: renamed to 'firstIndex(where:)' if let index = strongSelf.scanQueue.index(where: { $0 == scanOperationBox.value! }) { ^ /Users/dong/work/flutter_prj/app/homssen/ios/Pods/MultiplatformBleAdapter/iOS/RxBluetoothKit/BluetoothManager.swift:161:65...

2021.09.29