Flutter 상태 관리의 실현

7830 단어 Flutter상태 관리
상태 관리
전체 app 의 상태 에서 사용자 가 app 을 사용 하 는 것 이 로그 인 상태 입 니까?아니면 관광객 상태 입 니까?한 단추 가 작 을 때 까지 단 추 를 누 르 면 선택 한 상태 인지 누 르 지 않 은 상태 인지 등 이 상태 관리 입 니 다.
2.명령 식 프로 그래 밍 과 성명 식 프로 그래 밍 상태 관리의 차이
iOS 는 상 태 를 어떻게 관리 합 니까?일반적으로 이 컨트롤 을 가 져 온 다음 에 원 하 는 상 태 를 설정 합 니 다.Flutter 응용 상태 가 바 뀌 었 을 때(예 를 들 어 사용자 가 설정 인터페이스 에서 스위치 옵션 을 클릭 했 을 때)상 태 를 바 꾸 었 습 니 다.이것 은 사용자 인터페이스의 재 그림 을 촉발 합 니 다.사용자 인터페이스 자 체 를 바 꾸 는 것 은 필요 하지 않 습 니 다(예 를 들 어 widget.setText)-상 태 를 바 꾸 면 사용자 인터페이스 가 다시 구 축 됩 니 다.
3.상태 관리 중의 성명 식 프로 그래 밍 사고
Flutter 응용 은 성명 식 입 니 다.이것 은 Flutter 가 구축 한 사용자 인터페이스 가 바로 응용 현재 상태 임 을 의미 합 니 다.

화면 상태 가 바 뀌 면 화면 을 다시 그립 니 다.iOS 의 OC 언어 처럼 상 태 를 바 꿔 야 할 컨트롤 을 가 져 오 는 것 이 아니 라 원 하 는 화면 을 그립 니 다.
4.짧 은 시간(ephemeral)과 응용(app)상태의 차이
Flutter 의 상태 관 리 는 짧 은 시간 상태 와 응용 상태 로 나 뉜 다.
짧 은 시간 상 태 는 한 페이지 에서 유지 해 야 할 상태 입 니 다.예 를 들 어 페이지 데이터 가 몇 페이지 에 불 러 왔 는 지,관심 버튼 이 관심 이 있 는 지,관심 이 없 는 지 등 은 모두 한 페이지 에서 유지 해 야 할 상태 입 니 다.widget 트 리 의 다른 부분 은 이 상태 에 접근 할 필요 가 없습니다.이런 상 태 를 서열 화 할 필 요 는 없다.이런 상 태 는 복잡 한 방식 으로 바 뀌 지 않 는 다.다시 말 하면 상태 관리 구조(예 를 들 어 ScopedModel,Redux)를 사용 하여 이런 상 태 를 관리 할 필요 가 없다.당신 이 필요 로 하 는 것 은 단지 Stateful Widget 입 니 다.
아래 에서 아래 탐색 표시 줄 에서 현재 선 택 된 항목 이 어떻게 저장 되 는 지 볼 수 있 습 니 다MyHomepage State 류 의index 변수 중.이 예 에서index 는 짧 은 시간 상태 입 니 다.

class MyHomepage extends StatefulWidget {
 @override
 _MyHomepageState createState() => _MyHomepageState();
}

class _MyHomepageState extends State<MyHomepage> {
 int _index = 0;

 @override
 Widget build(BuildContext context) {
  return BottomNavigationBar(
   currentIndex: _index,
   onTap: (newIndex) {
    setState(() {
     _index = newIndex;
    });
   },
   // ... items ...
  );
 }
}
여기 서 setState()와 변 수 를 사용 하면 관리 상태의 목적 을 달성 할 수 있 습 니 다.당신 의 app 의 다른 부분 에 접근 할 필요 가 없습니다index。이 변 수 는 MyHomepage widget 에서 만 변 경 됩 니 다.그리고 사용자 가 이 앱 을 닫 고 다시 시작 하면index 는 원래 상 태 를 유지 하지 않 고 초기 화 됩 니 다.
응용 상태 입 니 다.응용 프로그램의 여러 부분 에서 짧 지 않 은 상 태 를 공유 하고 사용자 세 션 기간 에 이 상 태 를 유지 하려 면 응용 상태 라 고 부 릅 니 다.응용 상태의 예:
1.사용자 옵션
2.로그 인 정보
3.소 셜 네트워크 서비스 에서 의 알림
4.전자상거래 애플 리 케 이 션 의 카 트
5.뉴스 애플 리 케 이 션 의 글 읽 기/읽 지 않 은 상태
5.공유 상태 관리
Flutter 에 서 는 일반적으로 저장 상태의 대상 을 widget 트 리 에 대응 하 는 widget 의 상층 부 에 두 고 변 경 될 때 해당 하 는 widget 은 상층 부 에서 재 구성 합 니 다.이 메커니즘 때문에 widget 은 생명주기 문 제 를 고려 할 필요 가 없습니다.상부 에 저 장 된 데이터 의 대상 성명 에 필요 한 내용 만 표시 하면 됩 니 다.내용 이 바 뀌 면 오래된 widget 이 사라 지고 새로운 widget 으로 대 체 됩 니 다.Flutter 원생 은 공유 상 태 를 관리 하 는 두 가지 방법 을 제공 합 니 다.
5.1 --InheritedWidget

class ADCounterWidget extends InheritedWidget {
 // 1.      
 final int counter;

 // 2.       
 ADCounterWidget({this.counter, Widget child}): super(child: child);

 // 3.     Widget     InheritedWidget
 static ADCounterWidget of(BuildContext context) {
  //   Element ,       ADCounterElement,  Element   Widget  
  return context.dependOnInheritedWidgetOfExactType();
 }

 // 4.      State  didChangeDependencies  
 @override
 bool updateShouldNotify(ADCounterWidget oldWidget) {
  return oldWidget.counter != counter;
 }
}
이 방법 은 context 를 통 해 부모 급 HYDataWidget 을 찾 는 of 방법 을 정의 합 니 다.
updateShouldNotify 방법 은 신 구 HYDataWidget 을 비교 하 는 것 입 니 다.업데이트 에 의존 하 는 Widget 이 필요 합 니까?

class HYHomePage extends StatefulWidget {
 @override
 _HYHomePageState createState() => _HYHomePageState();
}

class _HYHomePageState extends State<HYHomePage> {
 int data = 100;

 @override
 Widget build(BuildContext context) {
  return Scaffold(
   appBar: AppBar(
    title: Text("InheritedWidget"),
   ),
   body: HYDataWidget(
    counter: data,
    child: Center(
     child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
       HYShowData()
      ],
     ),
    ),
   ),
   floatingActionButton: FloatingActionButton(
    child: Icon(Icons.add),
    onPressed: () {
     setState(() {
      data++;
     });
    },
   ),
  );
 }
}
HYDataWidget 을 만 들 고 데 이 터 를 전송 합 니 다(여기 서 단 추 를 누 르 면 데 이 터 를 수정 하고 다시 build 를 시작 합 니 다)
5.2 --Provider
Provider 라 이브 러 리 에는 세 가지 주요 용도 가 있 습 니 다.
Change Notifier:실제 데이터(상태)가 저 장 된 곳
  • ChangeNotifier Provider:Widget 트 리 에서 데이터(상태)를 제공 하 는 곳 에 해당 하 는 ChangeNotifier 를 만 듭 니 다
  • Consumer:Widget 트 리 에서 데이터(상태)를 사용 해 야 하 는 곳첫 번 째 단 계 는 프로그램의 맨 위 에 자신의 Change Notifier 를 만 듭 니 다.
  •  Change Notifier Provider 를 맨 위 에 올 려 놓 으 면 전체 응용 프로그램의 어느 곳 에서 든 Counter Provider 를 사용 할 수 있 습 니 다
  • Change Notifier 에서 개인 적 인 을 만 듭 니 다.counter,그리고 getter 와 setter 를 제공 합 니 다
  • 4.567917.setter 에서 우 리 는counter 의 변경 사항 은 notify Listeners 방법 을 호출 하여 모든 Consumer 에 게 업 데 이 트 를 알 립 니 다
    
    void main() {
     runApp(ChangeNotifierProvider(
      create: (context) => CounterProvider(),
      child: MyApp(),
     ));
    }
    
    class CounterProvider extends ChangeNotifier {
     int _counter = 100;
     intget counter {
      return _counter;
     }
     set counter(int value) {
      _counter = value;
      notifyListeners();
     }
    }
    두 번 째 단 계 는 첫 페이지 에서 Consumer 도입 과 수정 상 태 를 사용 합 니 다.
  • body 에서 Consumer 를 사용 하려 면 Consumer 는 builder 리 셋 함 수 를 입력 해 야 합 니 다.데이터 가 변화 할 때 데이터 에 의존 하 는 Consumer 에 builder 방법 을 다시 호출 하여 구축 하 라 고 알려 줍 니 다
  • floatingAction Button 에서 Consumer 를 사용 하고 단 추 를 눌 렀 을 때 Counter Notifier 의 conter 데 이 터 를 수정 합 니 다
  • 
    class HYHomePage extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
      return Scaffold(
       appBar: AppBar(
        title: Text("    "),
       ),
       body: Center(
        child: Consumer<CounterProvider>(
         builder: (ctx, counterPro, child) {
          return Text("    :${counterPro.counter}", style: TextStyle(fontSize: 20, color: Colors.red),);
         }
        ),
       ),
       floatingActionButton: Consumer<CounterProvider>(
        builder: (ctx, counterPro, child) {
         return FloatingActionButton(
          child: child,
          onPressed: () {
           counterPro.counter += 1;
          },
         );
        },
        child: Icon(Icons.add),
       ),
      );
     }
    }
    Consumer 의 builder 방법 은 세 가지 인자 가 있 습 니 다.
  • context,모든 build 방법 에 문맥 이 있 는데 목적 은 현재 나무의 위 치 를 알 기 위해 서 입 니 다
  • Change Notifier 에 대응 하 는 인 스 턴 스 이자 우리 가 builder 함수 에서 주로 사용 하 는 대상 입 니 다
  • child 는 최적화 하 는 것 이 목적 이다.만약 에 builder 아래 에 커 다란 서브 트 리 가 있다 면 모델 이 바 뀌 었 을 때 우 리 는 이 서브 트 리 를 다시 구축 하고 싶 지 않다.그러면 이 서브 트 리 를 Consumer 의 child 에 넣 고 여기 서 직접 도입 하면 된다(내 사례 중의 Icon 이 놓 은 위치 에 주의 하 라)
  • 네 번 째 단 계 는 새로운 페이지 를 만 들 고 새로운 페이지 에서 데 이 터 를 수정 합 니 다.
    
    class SecondPage extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
      return Scaffold(
       appBar: AppBar(
        title: Text("     "),
       ),
       floatingActionButton: Consumer<CounterProvider>(
        builder: (ctx, counterPro, child) {
         return FloatingActionButton(
          child: child,
          onPressed: () {
           counterPro.counter += 1;
          },
         );
        },
        child: Icon(Icons.add),
       ),
      );
     }
    }
    여기 서 Flutter 상태 관리의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Flutter 상태 관리 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기