인프런 커뮤니티 질문&답변

maker_suhyeon님의 프로필 이미지
maker_suhyeon

작성한 질문수

[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter

네이버 API 사용을 위한 프로젝트 사전 개발

네이버api프로젝트세팅부분에서

해결된 질문

작성

·

179

·

수정됨

0

안녕하세요!

dio주입할때 MyApp에서 바로 생성해서 NaverBookRepository(dio)에 넣어주면 되지 않나요? 왜 main()함수에서 넣어주는지 궁금합니다!

나중에 혼자서 프로젝트를 할때 이런 부분이 헷갈릴것 같아서요

또한 stateful위젯에서

stateful위젯을 상속받는 class와 (ex App) state를 상속받는 class(ex _AppState)에서 변수를 사용할 때 어떨때 stf위젯에 써서 state로 넘겨주는지, 아니면 state위젯 자체에서 바로 선언하고 쓰는지 알 수 있을까요??

stf위젯은 계속생성이되고, state위젯은 한번생성되면 (initState) build부분만 재 빌드 되잖아요 이 차이를 이용해서 하는것 같은데 구체적인 감은 안잡혀서요

개남님의 지식공유 부탁드립니다 ㅠㅠ!

 

답변 2

1

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

StatefulWidget의 경우
부모로부터 전달받는 값이 아닌 이상 보통 State 상속받은 클레스 내에 변수를 선언합니다.

 

부모로부터의 데이터를 사용하여 상태관리를 할 경우 StatefulWidget 클래스에서 받아주고(생성자)

부모와의 데이터 관계가 없을때는 State 클래스에서 생성한다고 보시면 되겠습니다.

 

한가지 예를 들어 설명드리자면

submit 버튼이 있다고 가정하겠습니다.

submit 버튼이 동작하려면 부모 위젯의 입력 필드(id/password)들이 채워져야 버튼이 활성화가 될 것입니다.

이때 Submit 버튼에 disabled라는 값이 있어야하고 그 값은 부모위젯에의해 결정됩니다(id/pssword 입력여부) 이때 disabled는 StatefulWidget에 존재하게됩니다 그리고 버튼이 눌릴때 특정 애니메이션 효과를 넣는다고 가정하면 애니메이션은 부모위젯과 관계가 없죠 그렇기때문에 애니메이션 컨트롤러는 State쪽에 선언하고 관리 합니다

maker_suhyeon님의 프로필 이미지
maker_suhyeon
질문자

감사합니다!

1

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

안녕하세요 좋은 질문을 주셔서 저 역시 한번 더 생각할 수 있었습니다. 

 

우선 dio 주입을 MyApp에서 만들어서 하지 않고 main 함수에서 해주는 이유에 대해서 설명을 드리겠습니다. 

사실 MyApp에서 만들어서 사용해도 문제 되지 않습니다. 

단지 main 함수에서 만들어준 이유는 배포 환경을 고려해서 설계하기 위함입니다.  물론 지금 강의에서 만든 앱의 경우 

Flavor 설정(배포별 환경이 다르게 설정)을 하지 않아서 MyApp에 생성해도 상관이 없겠지만 

만일 Flavor를 설정한다고 한다면 main 함수를  local, dev, staging, prod 별로 나눠서 설정하게 될 것이고 

각 함수에 각각의 endpoint가  설정되어야 하기 때문입니다. 

 

두번째 질문에 답을 드리자면 

Stateful 위젯과 Stateless 위젯을 사용하는 이유에 대한 질문인것 같은데 맞는지 모르겠네요 

어떨때 Stateful을 사용하고 어떨때 Stateless를 사용하는지는 왠만하면 Stateless위젯을 사용합니다. 

이유는 상태관리를 bloc을 사용해서 관리 하고 있기 때문에 페이지나 컨포넌트에 상태를 갖을 필요가 없기 때문입니다. 

그럼에도 Stateful를 사용해야 할때가 있는데 그럴때는 위젯의 라이프사이클을 사용하기 위함입니다. 

Stateful 위젯은 다양한 경우 발생되는 이벤트들지 존재합니다. (Initstate, dispose, didChangeDependencies. 등등 ) 

각각을 왜 사용하는지에 대해서는 위젯 라이프사이클에 대한 영상을 찾아보심을 추천드립니다. 

그리고 Stateful를 사용할때는 간단한 컨포넌트를 만들때 사용합니다. bloc이나 cubit을 사용하기에는 heavy 하기 때문에 간단하게 위젯의 상태를 통해 만들어줄때 사용하게 됩니다. 

 

질문에 답이 되었을지 모르겠네요.

maker_suhyeon님의 프로필 이미지
maker_suhyeon
질문자

안녕하세요 정성가득한 답변 감사합니다.

첫번째 질문 dio 사용위치에 대해선 덕분에 이해했습니다.

두번째 질문은 다른 질문으로 제가 설명이 부족했습니다.

 

예를 들어 이렇게 stateful위젯이 있습니다.

 

class App extends StatefulWidget {

const App({super.key});

@override

State<App> createState() => _AppState();

}

 

class _AppState extends State<App> {

}

 

 

  • 여기에서 변수 생성위치가 궁금합니다.

class App extends StatefulWidget

{

// 이곳에서 변수를 생성해서

const App({super.key});

@override

State<App> createState() => _AppState();

}

 

class _AppState extends State<App> {

 

//이곳에서 widget.변수 이렇게 쓰는 경우가 있고

아니면 바로

//이곳에서 변수를 생성할수 있는 경우가 있죠

}

 

=> 어디서 변수 선언을 해야하는지 궁금합니다.

 

  • 1. 생성자를 통해 값을 받아야할때

class App extends StatefulWidget

{

final String test;

const App({ requrid this.test, super.key});

@override

State<App> createState() => _AppState();

}

 

class _AppState extends State<App> {

 

  • 여기서는 widget.test 로 접근-사용

}

 

1번은 해당 stf위젯을 사용하는 어떤 곳에서 값을 받아 App에서 _AppState에 전달해주는 경우가 있죠

 

  • 여기서 궁금한 것은 1번경우와같이 생성자를 통해 값을 받아야하는 경우가 아닐때 변수선언위치가 궁금합니다.

 

  • 예를 들어

 

class App extends StatefulWidget

{

final String controller; //여기에 변수가 있다면

@override

State<App> createState() => _AppState();

}

 

class _AppState extends State<App> {

@override

void initState(){

widget.controller = "initalize....";

//여기서 초기화를 해주는 경우가 있죠

}

 

=> _AppState에서 controller를 선언-생성하면 되는데, 굳이 App에서 선언하고, _AppState에서 초기화를 해주는 이유는

호출하는 곳에서 App은 재생성(폐기)되지만

_AppState는 이전에 한번 만들어지면 initState는 재생성이 안되고 bulid만 재생성이 되기 때문에

_AppState의 initState에서 초기화해주는 거라고 알고있습니다만...

구체적인 사용예시를 잘 모르겠습니다. (이렇게 알고 있는게 맞는지도 잘 모르겠네요)

말그대로 제가 상황판단을 해서 알아서 써야하는 것일까요??

 

 

maker_suhyeon님의 프로필 이미지
maker_suhyeon

작성한 질문수

질문하기