ref : 코딩 애플[Flutter로 만드는 iOS, Android 앱] 강의
실제로 유저의 연락처를 꺼내보자
연락처 꺼내는 패키지를 설치해야한다.
전구 누르고 pub get 해서 설치까지 하자
main.dart 파일에도 패키지 import 까지 해주기
허락이 되었을 때에 연락처를 가져오는 코드를 짜봤다.
contacts 라는 변수에 패키지 사용법에 따라 await ContactsService.getContacts(); 라고 작성해줬다.
그럼 저 contacts 에 연락처가 담기게 된다.
오래걸리는 코드이기때문에 await 을 붙이는 것이 권장된다(패키지 사용법일 뿐)
근데 실행하면 새폰이기 때문에 print(contacts) 해도 암것도 안뜬다.
그래서 위처럼 연락처들어가서 따로 추가해줬다.
연락처 버튼을 누르니 연락처가 출력된다. 리스트 안에 담아주는 것 같다.
근데 저건 연락처 1개의 전체 하나를 의미하고
그 연락처의 특정 정보를 따로 출력하려면 contacts[0].familyName 이런식으로 . 을 써서 코드를 추가한다.
0번째 연락처의 familyName 은 Potter 라고 잘 나온다
이름 전체를 나오게 하려면 displayName 을 쓰면 되겠다.
전화번호도 있고, 이메일도 있고 다 있다.
이번엔 연락처를 폰에 추가하는 법
변수하나 만들고 Contact()
클래스에서 인스턴스를 뽑아내는 거다
new 는 생략가능하고
원하는 정보를 쓴뒤 addContact 를 이용해서 newPerson 인스턴스 정보를 넣으면 되겠다.
실제 연락처를 위젯으로 보여주려면?
현재 위젯에서 보여주는 연락처들은 저 name 리스트에 넣어서 보관중이었다.
나는 contacts 라는 변수에 실제 연락처를 넣어놨으니까 name 말고 contacts 로 대체해야겠다.
주의할 점은 state 변경하고 싶으면 setState() 안에 넣어야하고
타입을 잘 지켜야한다.
name 은 List<String> 타입인데 (string 이 들어가는 리스트라는 뜻)
contacts 는 리스트이긴 리스트인데 List<Contacts> 임
그래서 이에대한 해결책이 있다면..
- Union Type 이라는 패키지를 깔아서 변수 하나에 여러개의 타입이 가능하도록 만드는 것
- List<dynamic> 타입으로 만드는 것 (name 리스트를 처음부터 비워놓는거다. 그럼 처음엔 모든 타입이 들어갈 수 있음)
- 변수를 만들 때 미리 타입을 강제로 지정하기( name 리스트의 타입을 List<Contact> 라고 엄격하게 지정한다)
Contact 타입의 요소가 들어가도 문제 없게끔 name 리스트를 비워놓았고
setState 함수 안에서 name 리스트를 contacts 리스트가 대체하게끔 만들었다.
name 리스트 요소의 이름을 출력하게끔 수정했다.
버튼을 눌렀는데 잘 불러와진다.
과제!
지금 현상태 앱의 오른쪽 아래 눌러서
이름을 입력한다음에 완료를 누르면 실제연락처에 추가되어야한다.(전화번호는 생략)
완료 버튼 onPressed 일때에 입력받은 inputData.text 를 newContact 라는 객체의 givenName 속성에 넣고
이 newContact 를 실제 연락처에 저장하도록 ContactsService.addContact 를 써줬다.
맨 마지막 줄은 name 리스트(state)에도 추가로 저장해주는 코드이다.
Navigator.pop(context);
도 추가해서 완료 누르면 창 꺼지게 했다.
응용
- 이름만 저장되는게 아니라 전화번호도 저장되게 할 수 있을 것같다
이러려면 입력란이 두 개 필요할 듯.