반응형

플러터 3.3.8 버전에서 개발중입니당.

탭뷰를 개발하기로 했다.

기본적인 탭뷰는 탭이 위로 가있는데, 내가 할 것은 탭이 바텀에 있는 것이다. 따라서 bottomNavigationBar를 이용할 것이다

class _MainTabPage extends State<MainTabPage> {
  final List<Widget> _tabScreens = [const AOSPage(), const IOSPage()];
  int _tabScreenIndex = 0;
  @override
  void initState() {
    super.initState();
  }

  void tabSelected(int index) {
    setState(() {
      _tabScreenIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('요즘 IT'),
        // ignore: prefer_const_constructors
        titleTextStyle:
            const TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
        backgroundColor: Colors.white,
      ),
      body: _tabScreens[_tabScreenIndex],
      bottomNavigationBar: BottomNavigationBar(
          onTap: tabSelected,
          currentIndex: _tabScreenIndex,
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(
              icon: Icon(Icons.android),
              label: 'AOS',
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.apple),
              label: 'IOS',
            ),
          ]),
    );
  }
}

사실 탭뷰에서는 데이터 정의할 것은 딱히 없어서 initState에 코딩할 것은 없다.
중요한 부분은 build 메소드이고, return을 Scaffold 메소드로 하게 되는데, Scaffold 메소드는 화면에 알맞게 배치되게 해주는 위젯이라 보면되겠다.

프로퍼티로 appBarbody가 대표적이고, 앱바는 간단하게 요즘 IT를 기입해주었다. 일단은 디자인은 보류한 상태로 개발을 진행하고 추후에 디자인을 첨가하는 방식으로 프로젝트를 진행하도록 하겠다.

body부분에 _tabScreenIndexs 리스트의 인덱스에 따라 Page가 디스플레이 되는 구조이고, 인덱스 컨트롤을 bottomNavigationBar의 onTap프로퍼티에 부착된 메소드인 tabSelected에서 한다고 보면 되겠다.

간단히 말하자면 탭 버튼의 인덱스가 onTapdml tabSelected메소드로 인해 _tabScreens의 인덱스가 되고 화면에 해당 페이지가 디스플레이가 되는 구조이다. 같은 말을 반복한건가 암튼;;

그 밖의 프로퍼티의 설명으로 currentIndex는 탭 버튼을 눌렀을 때 활성화(색 변화)효과를 주기 위해 인덱스 변경을 해주어야 하는 부분이다.
items는 뭐... 말 그대로 탭 버튼에 뭐 들어갈지 설정해 주는데 BottomNavigationBarItem 리스트로 설정해주면 된다.

너무 코드 설명만 했으니 다트 관련 얘기도 하나 해보자면 constfinal에 대해 이야기해볼 필요가 있다.

위 코드에도 const나 final이 종종 보이는데 왜 쓸까? 그리고 안쓰면 왜이렇게 파란 줄이 뜨고 가끔 빨간줄이 뜰까?

  • final - 코드 실행 결과로 결정되는 상수
  • const - 코드 실행 전 결정되는 상수
    즉, 개발을 하다가 상수인데, final이나 const 처리가 안되어 있으면 성능상에 문제가 있고 실수로 인해 변경의 여지가 있기 때문에 파란 줄이 뜰 수 있다. 그리고 date.now() 같은 경우 코드 실행 결과로 결정되는 상수이기 때문에 const를 사용할 수 없다 뭐 이런 느낌?

여튼 이 두개를 쓰는 가장 큰 이유는 성능 때문이라 보면 되겠다. 고정 값들은 무조건 const 또는 final을 적용하는 습관을 기르자.

이제 우리가 해야할 것은 AOSPage와 IOSPage를 만드는 것이다. 지금은 페이지가 없어서 실행조차 못한다. ㅠㅠ
그래서 여태 이 포스트에 이미지가 없다...

암튼 간단한 페이지를 만들어보자.

AOSPage.dart

IOS는 그냥 텍스트만 바꿨다.

실행화면


아주 잘 작동하는 것을 확인할 수 있다~!

반응형

'Flutter' 카테고리의 다른 글

Flutter 프로젝트 만들기 - 2  (0) 2022.11.13
Flutter 프로젝트 만들기 - 1  (0) 2022.11.13
Flutter vs React Native  (0) 2022.10.02
반응형

플러터 3.3.8로 개발합니다.

플러터로 요즘 IT를 만들기로 했었다.

기본적인 프로젝트 세팅을 끝났고, 이제 메인 페이지를 만들 차례이다.

메인 페이지는 가볍게 탭뷰로 가볼 것이고, 탭 뷰는 일단 AOS와 IOS만 탭 리스트로 담을 것이다. (나중에 추가할 계획)

포스팅을 하면서 플러터 기본 설명까지 겸할까 고민해봤는데, 일단 나도 공부할 겸 아는 것만 최대한 써보도록 해보겠다.

플러터는 위젯들의 부모 자식 관계로 구성되어 있다.

(내 생각엔...)가장 중요한 위젯에는 StatelessWidget과 StatefulWidget이 있는데, 영어를 잘하고 응용력이 뛰어나면 알겠지만 액티비티(안드로이드 개발을 했어서 앱 페이지를 액티비티라고 표현하겠다.)의 상태에 관한 위젯이다.

StatelessWidget은 정적 액티비티를 위한 위젯이며 성능이 상당히 좋다. 다만 인터렉션(버튼, 텍스트 박스 등)이 없다.

StatefulWidget은 그 반대라 할 수 있다 대부분의 액티비티가 이 위젯이라 보면 되겠다.

일단 프로젝트 생성했을 때 만들어졌던 샘플 코드를 싹 다 지워버리자. 구글 형들의 선행은 사실 필요가 없다.

주석들도 다 없어지고 아주 깨끗한 메인 다트가 되었다. 역시 사람이나 코드나 꾸미면 보기 좋아진다.

그런의미에서 vscode 코드 매니징 꿀팁을 방출하도록 하겠다.

코드 포매팅 단축키를 지정하여 다트에 맞게 자동 포맷을 할 수 있다.

파일 > 기본 설정 > 바로가기 키 > 문서 서식

원하는 키를 바인딩하여 사용해주면 알아서 포매팅이 된다. 굿.

메인 다트에서 MyApp 클래스가 뭔지에 대해 궁금할 수 있다. 뭐냐면 이 프로젝트의 루트 위젯이라고 생각하면 된다.

루트 위젯은 지금 build 메소드에서 MaterialApp 메소드를 리턴하고 있는데, MaterialApp이 UI를 그려주는 메소드이기 때문에 MyApp 클래스 자체가 Stateful한 것은 아니므로 StatelessWidget을 상속받는다.

따라서 MaterialApp의 프로퍼티 중 하나인 home에서 빨간 줄이 그어져 있기 때문에 우리는 MainTabPage를 만들어 주어야한다.

lib 폴더 내부의 폴더 트리 구조는 정말 개발자 마다 제각각이기 때문에 나도 어디서 주워먹은 트리구조를 사용하도록 하겠다.

페이지 파일을 만들어주고 클래스 까지 만들어 준 다음 임포트를 메인 다트 파일에서 해준다면 빨간줄이 사라지는 것을 확인할 수 있다. 

별로 진행한 것도 없는데 글이 참 길어지는데 더 쓸지말지 고민된다. 너무 진도가 안나갔으니 더 써보겠읍니다.

메인 탭 페이지는 bottomNavigationBar가 핵심 위젯이라 보면 되겠다.

일단 대분류 위젯으로 탭으로 조작을 하기 때문에 StatefulWidget을 상속 받아준다.

State는 뭔가요? createState() => _MainTabPage(); 뭔 개소린가요?;; 라고 할 수 있겠다.

일단 () => 이건 화살표함수라고 하는데 기본적으로 함수의 형태는

type name (args){

~some code~

}

의 형태인데 이 것을 type name (args) => ~some code ~로 줄여주는 것이다. 간단 명료하다. 다만, 한 줄로 줄이는 것이기에 한 줄 메소드만 화살표 함수를 사용할 수 있다.

그리고 State는 뭘까  우리는 메인 탭 페이지를 Stateful하게 사용할 것이기 때문에 State 즉, 데이터에 대한 정의를 해주어야 한다. 플러터에서 State란 데이터를 명시한다는 것을 명심하자 ㅎㅎ

흠.. 탭 페이지는 다음 포스트에서 할까..?

반응형

'Flutter' 카테고리의 다른 글

Flutter 프로젝트 만들기 - 3  (0) 2022.11.13
Flutter 프로젝트 만들기 - 1  (0) 2022.11.13
Flutter vs React Native  (0) 2022.10.02
반응형

플러터로 프로젝트를 시작해보자

간단하게 앱 컨텐츠로 개발자 면접 정보 디스플레이 앱이고, 파이어 베이스에 연동하여 업데이트가 용이하도록 만들 생각이다.

메인 위젯은 탭 뷰와 리스트 뷰가 되겠고, 정보를 담는 메인 위젯은 마크다운 위젯이 될 것 같다.

이렇게 정리해보고 프로젝트를 시작해보자.

플러터는 aos, ios, 웹, 윈도우, 리눅스, 맥을 지원하기 때문에 환경 구성을 조금 해주어야한다.

따라서 우리에게 환경을 진단해줄 의사선생님인 flutter doctor가 필요하다.

의사 선생님을 호출하면 flutter 환경 구성에 대해 어떤 것이 부족한지 진단을 싹다 해주시는데, 이 부분은 뭐.. 검색들을 해보면서 잘 맞춰보자 

간단하게 안드로이드 스튜디오를 설치해서 sdk 매니저에서 설치하란거 설치하고, 비주얼 스튜디오에서 c++ 워크로드 설치하고 vs code 설치하고 플러터 sdk 설치하면 된다. 뭐 이정도만 해도.. 다 된다고 본다.

그 밖에 에뮬레이터를 연결하는 부분은 안드로이드 스튜디오에서 에뮬레이터를 입맛에 맞게 설치하고 vscode 에서 f1을 누른 뒤 select device를 검색한 후 거기서 에뮬레이터를 선택해주면 실행되고 나중에 플러터 개발을 하게되면 그 에뮬레이터에 반영이 되는 구조이다. 일단은 내가 윈도우에서 하고있어서 구글 폰밖에 못써봤다...ㅠ

각설하고, 환경 구성이 끝났다면 프로젝트를 생성해보자.

최신 개발자 면접 정보 앱 답게 요즘 IT 라는 앱을 만들 것이다.

flutter create recent_it를 입력해주고 아래 지시 대로 두 줄을 입력해준다.

아무래도 같이 설치되는 것이 많기 때문에 시간이 좀 오래 걸리는 느낌이다. 아님 내 엘지 그램이 똥컴이거나...

프로젝트가 생성되면 다음과 같은 프로젝트 트리가 생성되는데 중요한 것들에 대해 설명하도록 하겠다.

lib: 우리가 가장 많이 접근해야 하는 폴더로 메인 소스코드가 담기게 되며 lib의 메인 코드를 빌드하게 되면 android, ios, linux, macos, web, windows: 각각의 플랫폼에 관련된 코드가 담기게 된다. 

test: lib에서 개발한 flutter 코드를 테스트할 수 있는 공간이다.

pubspec.yaml: 외부 라이브러리 등 프로젝트에 대한 설정 파일이다. 

플젝을 생성하기만해도 위 사진과 같이 데모 앱을 만들어주신다. 역시 구글 형님들 잘쓰겠습니다.

구글 형님들의 친절을 고맙게 받아 요즘 IT를 잘 만들어 봅시다! 화이팅~!

반응형

'Flutter' 카테고리의 다른 글

Flutter 프로젝트 만들기 - 3  (0) 2022.11.13
Flutter 프로젝트 만들기 - 2  (0) 2022.11.13
Flutter vs React Native  (0) 2022.10.02
반응형

나는 안드로이드 개발은 해봤는데, 항상 문제점이 ios 앱은...? 이었다.

그러던 중 크로스 플랫폼에 대해 알아보게 되었고 크로스 플랫폼 개발에는 flutter, RN(React Native) 등이 있는데 언급한 두가지가 가장 유명한 것으로 확인했다.

그렇다면 나는 어떤 것을 사용해야 할까에 대한 조사를 해보았다.

언어

Flutter (Dart)

  • 객체지향언어이다.
    C문법을 따르고 있어 대부분의 개발자가 쉽게 배울 수 있다.
  • Flutter 개발에 최적화 되어있다.
  • Null Safety를 지원한다.

RN (JavaScript)

  • 많이들 쓴다.
  • npm으로 쉽게 패키지를 가져올 수 있다.
  • 커뮤니티가 크다.

러닝 커브

러닝커브는 한마디로 학습 난이도인데, 내 입장에선 자바스크립트의 장점인 많이들 쓴다...에서 막히므로 새로운 것을 도전하는게 나아보인다. 내가 생각했을 때 러닝커브라는 것은 성실함으로 무찌를 수 있기 때문에 이 섹션은 넘어가보자.

성능

공부하기 쉽고, 개발이 빠르다 이전에 가장 중요한 점은 성능이라 할 수 있다.

Flutter는 2d 기반 오픈소스 라이브러리인 skia 그래필 라이브러리와 C/C++ 엔진을 사용한다.

RN은 JS Bridge로 불리는 자바스크립트 런타임 환경을 기반으로 하며 페이스북에서 개발한 FLUX아키텍쳐를 사용한다.

정리하자면, Flutter가 좀 더 기계어에 가까운 언어를 사용하므로 성능이 높다.

테스트

RN은 통합 및 UI 수준의 테스트에 대한 공식 지원이 없다. 서드파티 도구를 이용해야하며 IOS 앱을 앱스토어에 자동으로 배포할 수 없다.

플러터는 공식적인 테스트 자동화를 지원한다.

결론

조금 비교할 만한 항목들이 더 있긴 하지만... 나는 더이상 비교할 필요가 없다고 느꼈다.

RN은 페이스북, 플러터는 구글 뭐 이런 문제가 아니라 성능이나 테스트 난이도 이 두가지에 초점을 맞췄기 때문에 플러터를 선택하기로 했다.

앞으로 크로스 플랫폼 앱을 플러터 기반으로 잘 만들어 보겠다.

반응형

'Flutter' 카테고리의 다른 글

Flutter 프로젝트 만들기 - 3  (0) 2022.11.13
Flutter 프로젝트 만들기 - 2  (0) 2022.11.13
Flutter 프로젝트 만들기 - 1  (0) 2022.11.13

+ Recent posts