Programing/플러터

[flutter] Provider 개념정리 - Count세기

하즈시 2022. 12. 12. 14:52
728x90

Provider 설치 

https://pub.dev/packages/provider/install

 

provider | Flutter Package

A wrapper around InheritedWidget to make them easier to use and more reusable.

pub.dev

 

 

dependencies:
  provider: ^6.0.4

 

 

---

 

import 'package:flutter/cupertino.dart';

//해당 클래스 안에서 선언된 멤버변수 상태관리를 provider가 하도록
class CountProvider extends ChangeNotifier {
  // 외부 접근 금지
  int _count = 0;

  String value = "test";
}

 

main.dart

@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: ChangeNotifierProvider(
      // child 하위 모든 위젯들은 create에서 만든 객체에 접근이 가능
      create: (BuildContext context) {
        return CountProvider();
      },
      child: Home(),
    ),
  );
}

 

home.dart

// null safety -> 나중에 널체크
CountProvider? _countProvider;

@override
Widget build(BuildContext context) {
  _countProvider = Provider.of<CountProvider>(context);
  // 하위 위젯에서 Provider 참조할 때
  if (_countProvider == null) {
    return Scaffold(
      body: Center(
        child: Text('nothing'),
      ),
    );
  }

 

 

하위 빌드 중 선택적으로 빌드하도록 

Consumer

provider 접근해서 받아오는 상위 위젯에서 Consumer로 감싸서 활용 

 

return Center(
  child: Text(
    Provider.of<CountProvider>(context).count.toString(),
    style: TextStyle(fontSize: 80),
  ),
);

 

 

이 부분을 

 

return Center(
  child: Consumer<CountProvider>(builder: (context, provider, child) {
    return Text(
      provider.count.toString(),
      style: TextStyle(fontSize: 80),
    );
  }),
);

 

이렇게 변경하고 

상위에서 listen을 false로 바꾸면 해당 프로바이더 값이 바꼈을 때 재빌드 안 하도록 

 

요점 

Consumer를 통해서 선택적으로 빌드할 위젯을 선택 가능 

listen false를 통해서 굳이 재빌드 안해도 되는 위젯 선택 가능 

 

 


 

 

 

 

 


주석 정리 및 전체 코드 

https://github.com/suhyun96/Flutter/tree/main/provider/movie_app

 

GitHub - suhyun96/Flutter: Flutter 공부 정리용

Flutter 공부 정리용 . Contribute to suhyun96/Flutter development by creating an account on GitHub.

github.com

 

출처 

https://www.youtube.com/watch?v=AmmjdvhQG1s 

 

 

728x90