[Flutter] Provider 사용해보기

Raon·2023년 1월 11일
0

Flutter

목록 보기
9/24

GetX만 사용하다보니 Flutter 개발자가 아니라 GetX 개발자가 된 느낌이 들어 Provider를 통해 Flutter 개발의 범위를 넓히려고 했다.

아래의 코드는 구글링을 통해 찾은 Provider 패키지를 사용한 예제의 코드 패턴을 학습해서 만든 예시이다.

class SomeWidget extends StatelessWidget {
  const SomeWidget({super.key});
	
  
  Widget build(BuildContext context) {
	return ChangeNotifierProvider(
	  create: (context) => SomeProvider(),
	  child: Scaffold(
		body: Center(
          child: Consumer<SomeProvider>(				
            builder: (context, provider, child) => Column(
              mainAxisAlignment: MainAxisAlignment.center,
			  children: [
				Text(
                  '${provider.person['name']} :'
				  '${provider.person['age']}'
				),
				ElevatedButton(
				  onPressed: () async {
					await provider.addAge();
				  },
				  child: const Text('Click'),
				),
			  ],
		    ),
		  ),
		),
	  ),
    );
  }
}

  
class SomeProvider extends ChangeNotifier {
  Map<String, dynamic> person = {
    'name': 'Jack',
	'age': 25,
  };
	
  Future<void> addAge() async {
	await Future.delayed(const Duration(seconds: 2));
	person['age'] = 26;
	notifyListeners();
  }
}

provider는 notifyListeners() 함수를 통해 변화를 UI에 갱신한다.

여기서 한 가지 궁금증이 생겼다.

notifyListeners()를 호출하는 모든 함수는 전부 void타입의 함수로 정의해야하는건가?

그래서 구글에 찾아보니 따로 관련된 답변을 찾을 수 없어 직접 테스트 해봤다.

class SomeWidget extends StatelessWidget {
  const SomeWidget({super.key});
	
  
  Widget build(BuildContext context) {
	return ChangeNotifierProvider(
	  create: (context) => SomeProvider(),
	  child: Scaffold(
		body: Center(
		  child: Consumer<SomeProvider>(
		    builder: (context, provider, child) => Column(
			  mainAxisAlignment: MainAxisAlignment.center,
			  children: [
				Text(
				  '${provider.person['name']} :'
				  '${provider.person['age']}'
				),
				ElevatedButton(
				  onPressed: () => provider.addAge().then(
					(value) => showDialog(
					  context: context,
					  builder: (context) => AlertDialog(
						content: Text('$value'),
					  ),
					),
				  ),
				  child: const Text('Click'),
			    ),
              ],
            ),
		  ),
		),
	  ),
    );
  }
}
 

class SomeProvider extends ChangeNotifier {
  Map<String, dynamic> person = {
	'name': 'Jack',
	'age': 25,
  };
	
  Future<int> addAge() async {
    await Future.delayed(const Duration(seconds: 2));
	person['age'] = 26;
	notifyListeners();
	
    await Future.delayed(const Duration(seconds: 2));
	person['age'] = 27;
	notifyListeners();
		
	return 10;
  }
}

이렇게 코드를 작성하니 결과적으로 2초 간격으로 화면이 2번 갱신된 후 곧바로 다이얼로그가 나타나 숫자 10을 표시했다.

결론적으로 notifyListeners()함수는 타입에 관계없이 사용할 수 있다.

Provider를 잠깐 사용해보니 GetX에 비해 코드 자체가 굉장히 직관적인 느낌이 들었다. GetX는 사용하기는 편리하지만 코드가 많아질수록 복잡해지는 느낌을 받았다면, Provider는 개발자가 확실하게 언제 화면을 갱신해줄지 명시함으로서 코드가 많아질수록 GetX보다 가독성 및 유지보수가 더욱 수월할 것 같다는 느낌이 든다.

profile
Flutter 개발자

0개의 댓글