목록분류 전체보기 (214)
파파비의 블로그
이것이 fetched된 data를 print한 것이다. 사실 구조는 Map이고, Map안에 Map이 또 들어가 있는 구조이다. 복잡해보이지만 몇가지 팁만 알면 가져오는 것은 식은 죽 먹기. 1. decode할 때, as 으로 해주어야 한다. 우리는 dynamic이 아니라 map인 것을 알지만, Dart는 구조상 그렇지 못하다고 한다. 그래서 실제로 dynamic대신 map으로 했더니 에러가 생겼다. 2. map은 foreach를 돌릴 수 있다. 각 entitiy에 대해 돌리니까, key랑 value를 다 체크할 수 있어서 매우 좋다. - 여기를 통해 원하는 작업을 할 수 있을 것이다. 3. notifyListeners를 절대 잊지 말자.
1. Fetching Data 데이터를 어딘가에서 가져오는 것, 그것은 데이터를 올리는 것 보다 쉽다. 왜냐면 데이터를 첨부할 필요가 없기 때문이다. 여기를 살펴보면, 주의해야할 점은 2가지로 압축된다. 1. async, await을 잘 쓰자. 그리고 얘네들은 try-catch로 무조건 에러 처리를 습관화하자. 2. get은 url만 넣으면 된다. 2. Init & of(context) 위에 저 메소드는 시작할 때 data를 끌고와서 화면을 구성하게 된다. 그럼 언제 실행하는게 좋을까? 당연히 init이 그 역할에 부응한다고 보이지 않는가? 그런데 Provider를 통해 활용하다보니, 우리는 of(context)를 init에 사용하게 된다. 그런데, init이 실행될 때는 context가 완전히 형성된 ..
1) 로딩중인지 아닌지 확인하는 bool 변수를 만든다. 2) future가 시작되면, bool의 값을 바꾸고, setstate을 실현 시킨다. saveform() 함수를 보면 실행 즉시 _isloading 변수가 true로 바뀌고 setstate을 통해 위젯을 다시 빌드한다. (로딩창이 띄워질 것이다) 그다음 then 이후에 완료가 되면 false로 설정하여 그때 이후에 화면이 pop되도록해두었다(잘려서 안보임) 3) 위젯은 bool값에 의해 로딩중일 땐 로딩위젯이 뜨고 그렇지 않을 땐 그냥 위젯들이 나오게 설계를 해둔다. scaffold의 body 속성에 isLoading이라는 변수에 의해 로딩창을 띄울지 본래 위젯들을 띄울지 설정해둔 모습이다.
어떤 메소드를 실행했을 때, 그것의 값이 딜레이가 생긴다면, 어떨까? 예를 들어 네트워크 요청을 했는데, 인터넷이 너무 느려서 응답속도가 느린 것 같은 것을 말한다. 기존 프로그래밍 방식대로라면 그 요청을 받기 위해 기다려야 한다. 반응이 올때까지 말이다. 반응이 매우 늦게 오게 된다면 프로그램은 일정수준동안 멈춰있게 되는데, 그것은 바람직하지 않다. 그래서 우리는 Future라는 개념이 있다. Future는 일단 실행해놓고, 결과는 나중에 다 되면 확인할게! 라고 생각하며 다음 줄의 코드들이 실행된다. 실행해야할 코드들이 다 실행된 뒤, 결과값을 확인한다. 만약 완료가 되었으면 실행되고, 그렇지 않으면 대기하다가 완료가 되면 알아서 실행하게 된다. '알아서 실행된다'는데 무엇이 실행되는것인가? then..
앱에서 데이터를 저장하는 방법. 1) 변수를 통한 Memory 에 저장하기 > 끄면 바로 날라가 버림 2) 기기 자체에 저장하는 방법 3) 웹서버에 데이터를 저장하는 방법 그 중에서 3번째를 특히 자세히 보고자 한다. 온라인상으로 data를 저장하는 방식이고, 온라인 상의 database에 저장을 해야 한다. 그러나 database를 다루는 것은 웹서버이므로, 우리는 웹서버와 통신을 통해 database내부의 data들을 CRUD할 수 있다. 그중에서 가장 자주 쓰이는 방식은 HTTP방식을 활용한 REST 방식이다. firebase의 경우에는 웹서버+Database를 엮은 backend서비스인데, 실제로 다른 백엔드를 쓰거나 백엔드를 구축하려면, database를 구축하고, 그 database를 다루는 ..
타당성을 검사하는 방법은 언제하느냐에 따라 2가지로 나눌 수 있다. 1. 매번 어떤 입력이 form으로 들어올 때 마다 할 것이냐 / 2. 마지막에 어떤 버튼을 누르면 할 것이냐 1번을 실행하는 것은 쉽다. Form위젯에 autovalidate 속성을 true로 설정해두면 된다. 디폴트는 false이다. 그러면 어디든 값이 하나라도 들어오거나 없어지면, 즉, 변경이 생기면 모든 Text form field 위젯들의 validator가 작동된다. 2번을 실행하는 것도 쉽다. 일단 당연히 autovalidate은 false여야 하고, form에 연결된 globalkey 위젯 레퍼런스를 통해, .currentState.validate() 을 실행하면 된다. 그러면 모든 TextFormField위젯들의 vali..
Form에서 입력한 값들을 어떻게 가져올까? 가져오는 방법은 어렵지 않다. 1) Form의 Data는 key를 통해 접근한다. - 먼저 GlobalKey(); 를 레퍼런스와 함께 만든다. - 그 뒤에 그 레퍼런스를 Form의 key 속성에 부여한다. - 따로 함수를 만든 뒤, 그 함수에서 레퍼런스.currentstate.save(); 메소드를 실행하면, Form안에 있는 모든 TextFormField의 onSave 속성의 콜백메소드들이 실행된다. 위 메소드를 보면 currtenState.save를 호출한다. 이렇게 되면 각 textformfield에 있는 onsave 메소드들이 작동하게 된다. 2) TextFormField의 onSave속성으로 각 입력값에 접근할 수 있다. TextFormField의 o..
입력을 받는 방법이 여러가지가 있다만, TextField를 다룬 적이 있다. 이것은 controller도 직접 달아야하고, 또 값을 매번 변할 때마다 어딘가에 저장도 따로 해주어야 하며, 특히 input에서 유효한값인지 아닌지도 판별할 때 직접 코딩으로 처리했어야했다. 이런 불편한 작업들을 덜어주는게 있는데, 그래서 더 정교한(?) input 컨트롤을 가능하게 해주는 위젯이 있다. 바로 "Form" 위젯이다. Form위젯은 먼저 형태가 없다. 그냥 컨트롤을 도와주는 위젯이다. 따라서 자식으로 input 관련 위젯을 넣어야 한다. 아래 코드를 살펴보자 간단한 형태다. 여기서 TextFormField는 자동으로 Form위젯과 연결된다. 데코레이션에서 labelText의 역할은 Hint비스무리한 역할로, 입력..