Voyage_dev
항해하는 개발자
Voyage_dev
전체 방문자
오늘
어제
  • All (158)
    • Front-End (102)
      • HTML & CSS (7)
      • JavaScript (13)
      • Web & 표준 & ETC (15)
      • React (17)
      • Next (13)
      • TypeScript (6)
      • Zustand (1)
      • AWS (4)
      • Redux (1)
      • MobX (9)
      • GraphQL (1)
      • Flutter (15)
    • 알고리즘 (12)
      • Java (11)
      • JavaScript (1)
    • Git (1)
    • Project (2)
      • 개인 (1)
      • 팀 (1)
    • Books (30)
      • 누구나 자료구조와 알고리즘 (20)
      • Do It 타입스크립트 프로그래밍 (9)
    • 자료구조 (6)
    • 취업 (1)
    • 항해플러스 (1)
      • 1주 (1)

블로그 메뉴

  • 👨🏻‍💻 Github
  • 💻 Rss 블로그
  • 🏊‍♂️ Resume
  • 🗂️ Portfolio

인기 글

최근 댓글

hELLO · Designed By 정상우.
Voyage_dev

항해하는 개발자

[Flutter] Provider
Front-End/Flutter

[Flutter] Provider

2023. 10. 28. 17:38

Flutter에서 전역 상태 관리를 하거나 위젯간에 상태를 공유하기 위해 사용되는 Provider를 알아보자

provider | Flutter Package

 

Provider란

만약에 부모 커스텀 위젯에 있던 state를 자식 커스텀 위젯으로 보내고 싶으면 3-step으로 보내야 한다. 하지만 부모 → 자식이 아니라 부모 → 자식 → 손자 위젯으로 보내고 싶으면 어떻게 할까?

코딩애플

  • 2번 보내면 된다

하지만 상태를 표시하기 위해 불필요한 위젯들이 re-build 되면서 성능 이슈가 발생할 수 있고 커스텀 위젯이 많아지면 많아질 수록 끔찍해진다

 

Provider는 이 문제를 해결하기 위해 등장했으며, 이렇게 동일한 상태(데이터)를 전역적으로 다른 위젯들과 공유할 때 사용한다

 

  • 전송 없이 모든 위젯이 state를 직접 가져다쓸 수 있게 만들어주는 패키지이다.

Provider 패키지 사용하기

// pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.1
import 'package:provider/provider.dart';

State 보관하는 store 필요

// lib/providers/[이름]dart

class Store1 extends ChangeNotifier { 
  var name = 'john kim';
}
  • Provider를 사용하기 위해서는 ChangeNotifier를 사용해 클래스를 생성해야 된다
  • 그리고 그 안에 state를 넣으면 된다

Store 등록

void main() {
  runApp(
      ChangeNotifierProvider(
          create: (c) => Store1(),
          child: MaterialApp(
              theme: style.theme,
              home: MyApp()
          )
      )
  );
}
  • store를 사용할 위젯들을 전부 ChangeNotifierProvider() 로 감싸면 된다
  • create: 안에는 아까 만들었던 store를 넣으면 되고
  • child: 안에는 store를 적용할 위젯을 넣는다

이제 내부의 모든 위젯들은 귀찮은 전송과정 없이도 store에 있던 state를 직접 사용가능하다

store에 있던 state 사용하고 싶으면

Text(context.watch<Store1>().name)
  • context.watch<store명>()를 사용하여 만든 Provider의 값을 점찍어서 쓰면 된다

state 변경하고 싶으면

class Counter extends ChangeNotifier { 
  var name = 'john kim';
  changeName() {
    name = 'john park';
    notifyListeners();  
  }
}
  • state를 변경하는 함수를 미리 만들고 부르는 식으로 state를 변경한다
  • notifyListeners()를 사용하면 state 사용중인 위젯이 알아서 재렌더링이 된다
ElevatedButton(
  onPressed: (){
    context.read<Store1>().changeName();
  }, 
  child: Text('팔로우')
)
  • state를 변경하고 싶으면 context.read<store명>().함수명() 를 쓰면 된다
  • 함수를 실행시키는 역할

Provider를 쓰면 귀찮은 전송과정 없이도 모든 커스텀위젯이 직접 state를 꺼내쓸 수 있다. 그리고 state 변경하는 로직도 store 안에 작성을 하다 보니 조금 더 디버깅이 쉬워진다

 

 

출처 : 코딩애플, https://deku.posstree.com/ko/flutter/provider/

'Front-End > Flutter' 카테고리의 다른 글

[Flutter] GridView, CustomScrollView  (5) 2023.10.28
[Flutter] MultiProvider  (0) 2023.10.28
[Flutter] Shared preferences  (0) 2023.10.28
[Flutter] GestureDetector  (0) 2023.10.28
[Flutter] 내장 Image file  (0) 2023.10.28
    'Front-End/Flutter' 카테고리의 다른 글
    • [Flutter] GridView, CustomScrollView
    • [Flutter] MultiProvider
    • [Flutter] Shared preferences
    • [Flutter] GestureDetector
    Voyage_dev
    Voyage_dev

    티스토리툴바