Flutter에서 유행 Riverpod를 사용해 보았습니다.

13973 단어 DartRiverpodFlutter

Riverpod란?



FLutter 경계에서 최근 유행 상태 관리 라이브러리.
Provider 보다 좋은 느낌으로 상태 관리를 할 수 있다.
자세한 것은 별로 알 수 없다.

이번에 만드는 것



Flutter로 애플리케이션을 만들면 나오는 것으로 친숙한 카운트업 앱.
오른쪽 하단의 「+」를 클릭 or 탭하면, 중앙의 숫자가 증가해 간다.



최종 형태는 여기에.
htps : // 기주 b. 코 m / tkt 코 r 포라 치온 / F ぅ r S 타테 마나게 멘 t / t 레에 / v1

구성




  • Domain은 상태 관리라고 생각하지 않는 순수한 객체입니다.
  • Controller는 Domain에 의존하고 ChangeNotifier를 상속하여 상태 관리를 담당합니다.

    응용 프로그램의 특정 범위 내에서 Riverpod의 ChangeNotifierProvider에 Controller를 전달하고이를 사용하여 상태를 관리합니다.
    라고 하는 방법을 취하고 있다.

    유용한 구성인지는 모른다

    구현



    도메인



    상태 관리라는 것을 생각하지 않는 순수한 객체
    class Counter {
      int _value = 0;
    
      int get value => _value;
    
      void increment() {
        _value++;
      }
    }
    

    컨트롤러



    Domain에 의존하고 ChangeNotifier를 상속하여 상태 관리를 담당합니다.
    import 'package:flutter/material.dart';
    import 'package:stateManagement/domain/counter.dart';
    
    class CounterController extends ChangeNotifier {
      CounterController(Counter counter) : this._counter = counter;
      Counter _counter;
    
      void increment() {
        this._counter.increment();
        notifyListeners();
      }
    
      int getCount() {
        return this._counter.value;
      }
    }
    

    Component



    CountText



    카운트 표시
    class CountText extends StatelessWidget {
      const CountText(this._count);
      final int _count;
    
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(
                _count.toString(),
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          ),
        );
      }
    }
    

    IncrementButton



    누르면 카운트가 증가하는 버튼
    typedef void Increment();
    
    class IncrementButton extends StatelessWidget {
      const IncrementButton(this._increment);
    
      final Increment _increment;
    
      @override
      Widget build(BuildContext context) {
        return FloatingActionButton(
          onPressed: this._increment,
          tooltip: 'Increment',
          child: Icon(Icons.add),
        );
      }
    }
    

    페이지


    import 'package:flutter/material.dart';
    import 'package:flutter_riverpod/flutter_riverpod.dart';
    // import counter.dart
    // import counter_controller.dart
    // import count_text.dart
    // import increment_button.dart
    
    class CounterPage extends StatelessWidget {
      CounterPage(this._title);
      final String _title;
      final counterProvider = ChangeNotifierProvider<CounterController>(
          (_) => CounterController(Counter()));
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text(this._title),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Consumer(
                    builder: (_, watch, __) =>
                        CountText(watch(counterProvider).getCount()),
                  )
                ],
              ),
            ),
            floatingActionButton: IncrementButton(context.read(counterProvider).increment));
      }
    }
    


    import 'package:flutter/material.dart';
    import 'package:flutter_riverpod/flutter_riverpod.dart';
    // import counter_page.dart;
    
    class RiverpodTestApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return ProviderScope(
          child: MaterialApp(
            title: 'CounterApp',
            theme: ThemeData(
              // This is the theme of your application.
              primarySwatch: Colors.orange,
              // This makes the visual density adapt to the platform that you run
              // the app on. For desktop platforms, the controls will be smaller and
              // closer together (more dense) than on mobile platforms.
              visualDensity: VisualDensity.adaptivePlatformDensity,
            ),
            home: CounterPage('Counter'),
          ),
        );
      }
    }
    

    Main


    import 'package:flutter/material.dart';
    // import riverpod_test.dart
    
    void main() {
      runApp(RiverpodTestApp());
    }
    

    여기까지 써서 기동해 주면, 카운트 앱은 정상적으로 동작할 것.

    요약



    자신이 하고 있는 것 같은 형태로 상태 관리를 하고 있는 기사는 보이지 않았기 때문에, 하나의 형태로서 남겨 본다.
    실천 운용한 구성이 아니기 때문에, 추후, 실제로 사용해 본 소감을 추기할 예정.

    「그 방법은 여기가 좋지 않아ー」등 있으면, 코멘트 부탁하고 싶습니다.
  • 좋은 웹페이지 즐겨찾기