글

라벨이 플러터인 게시물 표시

[flutter] flutter 환경설정 이슈 해결방법

 flutter 환경설정 이슈 해결방법 1. Android Studio 설치 2. Flutter 설치 flutter doctor -v 실행 문제1) [!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)     • Android SDK at C:\Users\luxep\AppData\Local\Android\sdk     X cmdline-tools component is missing 해결방법 :  Android Studio > Tools > SDK Manager : SDK Tools 탭  => 우측아래 Show Package Details 체크 후, Android SDK Command-line Tools (latest) 에서 8.0 선택 후 Apply 참고) https://brain-nim.tistory.com/87       Run `path/to/sdkmanager --install "cmdline-tools;latest"`       See https://developer.android.com/studio/command-line for more details.     X Android license status unknown. 해결방법 :  PowerShell 창에서 flutter 명령 파일 위치에서 .\flutter doctor --android-licenses       Run `flutter doctor --android-licenses` to accept the SDK licenses.       See https://flutter.dev/docs/get-started/install/windows#android-setup for more detai...

[Flutter] Dart에서 getter, setter 함수 만들기

이미지
 Dart 에서 get, set 함수를 만들수있습니다. private 변수를 get, set 함수를 이용해서 값을 가져오거나 넣을 수 있습니다. get 함수와 set 함수 입니다. get함수 name을 호출하면,  _name 의 변수가 null이 아니라면, _name 의 값을, null 이라면, empty 를 출력합니다. set함수 name에 값을 넣어주면, 넣어준 값이, _name에 저장됩니다. 위 get, set 함수 사용 예 입니다. 이 구문의 실행 결과입니다. set을 통해 입력한값들을 확인 할 수 있습니다.

[Flutter] android 릴리즈모드 빌드한 apk 를 스마트폰 설치 후, 네트워크 에러 해결방법

이미지
 Flutter 개발 하다보면, 릴리즈 모드로 빌드해서 apk 를 직접 스마트폰에 설치하는 일을 해 볼 것이다. 개발 모드 그러니까, 개발 피시에서 직접 폰에 바로 빌드를 하면, 앱에서 사용하는 네트워크동작이 잘 되는데,  릴리즈 모드로 apk를 빌드해서 직접 스마트폰에 설치해서 실행해 보면, 로그인 페이지는 뜨지만 로그인되지 않고 네트워크오류가 발생 한다. 원인은 Internet 권한 문제 때문이다. 개발 모드에서 네트워크 연결이 잘 되는 이유는, profile 폴더아래, AndroidManifest.xml 파일에, 이미 권한 허용 구문이 들어있기 때문이다. <uses-permission android :name ="android.permission.INTERNET" /> 이 구문이, main 폴더아래, AndroidManifest.xml 파일에 넣어 줘야한다. 해당 권한 구문을 넣으면 네트워크 오류 없이 개발모드와 동일하게 동작하는 것을 볼 수 있을 것이다.

[Flutter] mutable 과 immutable 에 대해서

 Dart 언어에서 뿐만 아니라, 다른 개발 언어에서도, 마찬가지로 알고 가야 할 개념인 mutable과 immutable 개념을 알아보자 mutable  : 변경가능, immutable : 변경 불가능 예를 들어,  class Car { int? id ; String? model ; Car({ this . id , this . model }) ; } void main () { Car car = Car (id: 1 , model: 'm1' ) ; Car car2 = car ; print( 'car, id= ${car. id } , model= ${car. model } ' ) ; car2. model = 'm2' ; print( 'car2, id= ${car. id } , model= ${car. model } ' ) ; print( 'car, id= ${car. id } , model= ${car. model } ' ) ; } 결과값 car, id=1, model=m1 car2, id=1, model=m2 car, id=1, model=m2 car2 에 car를 받아서, car2의 변수를 변경했는데, car2 의 model 변수 뿐아니라, car의 model 변수 값도 변경되었다. 이경우, car의 주소값이 car2에게 복사 된것이므로 같은 주소값을 가지고 있기때문이다, 그래서 car 객체 변수는 mutable 한 것 이다. car2를 다른 주소값으로 갖게하게끔 Car객체를 생성하고 싶다면, Car car2 = car; 대신, Car car2 = Car(id:1, model:'m2'); 라고 새로 객체를 생성해주면, car와 별개의 주소값 을 갖게된다. 다른예로, final name1 = 'David'; const name2 = 'Paul'; 둘다, immutable에 해당하는 변수 이다. 값을 할당하면, 다시 변...

[Flutter] 함수 파라미터 설명

Dart언어에서 함수 파라미터 사용방법을 설명한다. Positional parameters : 함수 인자 위치대로, 파라미터를 입력해줘야한다. Named parameters : 함수 인자를 위치에 상관없이, 파라미터명 이름으로 지정하여 값을 입력해 줘야한다. optional : 함수에서 받는 파라미터와 상관없이 입력할 값을 생략할 수 있는 사항인 경우이다. required : 반드시 해당 파라미터는 값을 입력해 줘야한다. 아래 예제 코드에서, Positional parameters 의 경우에서, 파라미터가 optional 인지, required 인지 예제이며, 또는 Named parameters 의 경우에서, 파라미터가 optional 인지, required 인지 예제를 설명한 사항이다. class Car { int? id ; String? model ; // Positional parameters // int id, String model => required Car(int id , String model) { this . id = id ; this . model = model ; } } class Train { int? id ; String? model ; // Named parameters // int? id, String? model => optional Train({int? id , String? model}) { this . id = id ; this . model = model ; } } class Ship { int? id ; String? model ; // Named parameters // required int id, required String model => required Ship({ required int id , required String model}) { this . id = id ; this . model ...

[Flutter] factory 싱글톤 클래스 테스트

 factory를 사용해서 싱글톤 클래스를 만들어 테스트 해보기. 생성자에 factory 문구 추가 class DB { static final Map<String , dynamic > _table = <String , dynamic >{} ; static final DB _db = DB . _internal () ; DB. _internal () ; factory DB() { return _db ; } set (String key , dynamic value) => _table [key] = value ; get (String key) => _table [key] ; } main 함수에서 위 DB클래스를 테스트 DB db1 = DB () ; db1.set( 'id' , '1' ) ; db1.set( 'lang' , 'korean' ) ; print( 'db1_id: ${db1.get( 'id' )} , db1_lnag: ${db1.get( 'lang' )} ' ) ; DB db2 = DB () ; print( 'db2_id: ${db2.get( 'id' )} , db2_lnag: ${db2.get( 'lang' )} ' ) ; 실행 결과 I/flutter ( 7655): db1_id: 1, db1_lnag: korean I/flutter ( 7655): db2_id: 1, db2_lnag: korean _table은 DB 클래스에서 데이터 저장하는 static final Map 변수입니다. _db는 DB 객체화 하며 내부 함수 호출하여 실행 main() 에서 DB객체 1번을 만들어 set 으로 데이터 넣어주고,  print출력하고 DB 객체 2번을 만들어서 다시한번 print출력으로 DB 2번객체의 get 값을 확인하면, DB객체1 번에 저장한 값이 가져옮...

[Flutter] Future, async, await 사용방법

 async 는 비동기 명령사용시 함수에 사용합니다. 비동기 명령은 네트워크통신으로 서버에서 데이터를 요청할 때 또는 delay time이 필요한 명령을 사용할때 사용합니다. 비동기 명령을 사용하는 이유는, 처리시간이 걸리는 명령(코드)에서 메인쓰레드를 잡아 기다리게하지 않고, 별도 쓰레드에서 처리하기 위해서 입니다. 비동기 명령을 통해, 메인쓰레드에서 하는 터치또는 화면표시 렌더링은 비동기명령 처리 시 기다리지 않고 처리됩니다. await을 설명하겠습니다. 비동기 명령을 사용하는 함수에서 async를 붙여 사용하는데, 비동기명령을 실행 할 때 await를 명령 또는 함수 앞에 붙여주면, 해당 async 붙인 함수 내에서는 await 를 붙인 함수가 실행될때 까지 기다린 후, 다음 명령을 실행합니다. Future 는 async 를 붙인 함수의 return값을 반환할때 반환형에 함께 붙여 사용합니다. ---- test code ---- void main() {     print('test 1');     print('name: ${getName()}');     print('test 2'); } Future<String> getName() async {     print('test 3');     var name = await requestName();      print('test 4');          return name; } ---- run result ---- test1 test2 test3 test4 ---- english ---- async is used for functions when using asynchronous commands. Asynchronous commands are used when requesting data from the server th...

[Flutter] 서버에 데이터 보내는 방법과 서버에서 데이터 받는 방법

✌ 안녕하세요. Flutter는 Http post 방식으로 서버에 API 요청 할 때, 파라미터를 넘기는 방법에 대해 설명 합니다.  http.post 함수를 사용할 때, body 에, 파라미터를 담아서 보냅니다. json 형태로 작성하되, jsonEncode() 함수에 담아서 보냅니다. 예시) jsonEncode([{'id':1, 'date':'2022-10-21'}, {'id':1, 'date':'2022-10-21'}]) 위 와 같이 Flutter에서 서버에 있는 API를 파라미터를 담아 요청 시, 파라미터가 API에 제대로 전달이 되어야만 합니다. 이때 서버의 API 수신 파라미터 수신객체가 Object 로 받으면, 파라미터의 포맷은 Map 형태가 됩니다. 서버의 언어가 JAVA인 경우, 그리고 Spring boot 에서 API를 만들고, 파라미터를 Object로 받으면, LinkedHashMap 형태로 들어옵니다.  그러면 Map에서 각 항목을 key값으로 꺼내서, 사용해야합니다. 매번 Map에서  각 항목을 key값으로 꺼내와야 하는 번거로움이 생깁니다. 불편하다면, 다른 방법으로, 수신파라미터 형태를 Object로 받지말고 특정객체로 생성하는 걸로 받으면 됩니다. 예를들어, Searched.java파일을 만들어, 변수로, 수신 받을 key값으로 정의합니다. 그러면, Map 형태 대신, Searched 형태로 받을 수 있습니다. 다른 API함수에 대해서도 같은 Searched.dart 파일을 사용하기 위해, 요청하는 Flutter의 요청 함수에서 사용하는 모든 파라미터 를 Searched.java파일에 넣어놓으면 Searched.java 파일하나로 Flutter의 API 요청을 모두 받아서 처리할 수 있습니다. 😄 감사합니다.

[Flutter] Android Studio에서 에뮬레이터 사용 시 알면 도움이 되는 정보

😃 안녕하세요. 10.0.2.2 ip를 이야기 해 봅니다. Android Studio 를 사용하면서, 에뮬레이터를 통해 빌드한 화면테스트를 합니다. 대부분의 앱은 서버와의 통신으로 데이터를 화면에 표시하는 모습입니다. 서버개발자가와 협업을 하면, 서버 개발자가 API를 개발하고 개발한 API를 앱 개발자가 사용합니다. 그러나, 서버개발과 앱개발을 혼자서 하는 경우도 많습니다.  서버에서 동작하는 API를 개발 할때, 앱개발 요청 시 API 동작의 정상여부 및 필요사항을 모두 확인해서 수정 및 완료하고, 앱개발을 들어 갈 수 있다면, 정말 좋은 개발 프로세스 일 것입니다. 하지만, 모두 테스트하고 제대로 동작하는 API를 개발했더라도, 앱개발 시, API 요청 시에, 앱에서의 요청시 좀더 부드럽고 편리한 뷰가 보이게 될 수 있습니다. 그래서 앱과 서버의 서비스 동시에 디버깅하며 서버 서비스 개발도 보완하고, 앱도 더 잘 만들고 싶을 것입니다. 그러면 서버의 서비스하는 API를 localhost에서 디버깅모드로 피시내에서 실행 할 수 있다면, 편리하게 앱도 피시에서 실행하며 서버의 API 개발 디버깅과 앱 디버깅을 동시에 할 수 있을 것 입니다.  그 때 로컬 피시에서의 디버깅 하는 앱에서 동일한 로컬 피시에서의 디버깅 하며 실행 시킨 서버의 API 호출 요청 시, 앱에서는 http://localhost:8080 또는 http://127.0.0.1:8080 과 같은 URL을 이용하고 싶을 것 입니다. 하지만, 앱에서 http://localhost:8080 또는 http://127.0.0.1:8080 이렇게 요청을 하면(하위 경로는 편의상 생략하여 설명중) 서버의 API로부터 호출 거절 수신을 앱에서 받게 될 것 입니다. 앱에서는 localhost 또는 127.0.0.1  대신, 10.0.2.2를 사용 해야 localhost또는 127.0.0.1 로 호출 하는 것 처럼 호출이 가능합니다. 따라서, 앱에서는 http://10.0.2.2:8...