• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

편집 기능에서 색상 설정 질문

22.09.12 21:38 작성 조회수 107

0

viewModel.onEvent(AddEditNoteEvent.changeColor(widget.note!.color));

initState에서 위의 코드를 넣어주었습니다. 하지만 initState에서 notifyListners()를 호출해서 그런지 state 오류가 발생합니다.

제 머리로 생각할 수 있는 대안은

changeColor에 파라미터로 isRebuild 라는 bool 값을 받아서

기본 값을 true 해놓고, true일 때만 notifyListeners가 호출되게 하였습니다.

이렇게 플래그를 주는게 좋은 방법일까요?

아니면 다른 키워드 주실 수 있을까요?

답변 1

답변을 작성해보세요.

0

플래그가 코드 복잡성을 올리는 것 같으니

가장 좋은 대안은 화면을 Navigation.push 하기 전에 ViewModel에 색깔을 지정한 후에 화면을 이동하면 되지 않을까요.

atomom님의 프로필

atomom

2022.09.12

그 방법은 생각하지 못했었네요. 그러면

note_screen의 gestureDetector 부분에

final addEditNoteViewModelViewModel = context.read<AddEditNoteViewModel>();
addEditNoteViewModelViewModel.onEvent(AddEditNoteEvent.changeColor(note.color)); 

위의 2줄 코드를 추가해주면 될까요?

혹시 그러하다면 한 스크린에 이렇게 다른 viewModel을 호출해도 상관이 없을까요?

ViewModel 을 앱 전체에서 하나의 인스턴스만 가지는 싱글턴으로 사용하기 때문에 문제 없을 것 같습니다.

더 나은 방법은 화면 이동시마다 ChangeNotifierProvider 설정을 새로 하여 ViewModel이 항상 새롭게 생성되도록 하는 방법도 있겠습니다. 이 때 ViewModel 생성시 노트 컬러를 생성자로 전달하는 방법이겠지요.

한석민님의 프로필

한석민

질문자

2022.09.13

감사합니다 ChangeNotifierProvider을 새로 설정하는 방법은 지금 어떻게 해야할지 떠오르지 않아서 좀 더 고민해보도록하겠습니다.

대략 이런 느낌으로 작성하면 매번 새로운 ViewModel을 생성하게 됩니다.

Navigator.push(
  context,
  MaterialPageRoute(builder: (context) =>
      ChangeNotifierProvider(
        create: (BuildContext context) {
          return MainViewModel(color);
        },
        child: NextScreen(),
      ),
  ),
);
한석민님의 프로필

한석민

질문자

2022.09.13

라우트 안에서 생성할 생각을 못했네요 또 한 번 배웁니다 감사합니다 ㅠㅠ. 적용했습니다.

이제 이번에 나온 강의 들으러 가겠습니다.

좋은 강의 감사합니다. 유튜브에서 multipart 강의도 보고 유용하게 사용했습니다 !
좋은하루 되세요 ^^!