Flutter에서 유행 Riverpod를 사용해 보았습니다.
Riverpod란?
FLutter 경계에서 최근 유행 상태 관리 라이브러리.
Provider 보다 좋은 느낌으로 상태 관리를 할 수 있다.
자세한 것은 별로 알 수 없다.
이번에 만드는 것
Flutter로 애플리케이션을 만들면 나오는 것으로 친숙한 카운트업 앱.
오른쪽 하단의 「+」를 클릭 or 탭하면, 중앙의 숫자가 증가해 간다.
최종 형태는 여기에.
htps : // 기주 b. 코 m / tkt 코 r 포라 치온 / F ぅ r S 타테 마나게 멘 t / t 레에 / v1
구성
Flutter로 애플리케이션을 만들면 나오는 것으로 친숙한 카운트업 앱.
오른쪽 하단의 「+」를 클릭 or 탭하면, 중앙의 숫자가 증가해 간다.
최종 형태는 여기에.
htps : // 기주 b. 코 m / tkt 코 r 포라 치온 / F ぅ r S 타테 마나게 멘 t / t 레에 / v1
구성
응용 프로그램의 특정 범위 내에서 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());
}
여기까지 써서 기동해 주면, 카운트 앱은 정상적으로 동작할 것.
요약
자신이 하고 있는 것 같은 형태로 상태 관리를 하고 있는 기사는 보이지 않았기 때문에, 하나의 형태로서 남겨 본다.
실천 운용한 구성이 아니기 때문에, 추후, 실제로 사용해 본 소감을 추기할 예정.
「그 방법은 여기가 좋지 않아ー」등 있으면, 코멘트 부탁하고 싶습니다.
class Counter {
int _value = 0;
int get value => _value;
void increment() {
_value++;
}
}
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;
}
}
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,
),
],
),
);
}
}
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'),
),
);
}
}
import 'package:flutter/material.dart';
// import riverpod_test.dart
void main() {
runApp(RiverpodTestApp());
}
자신이 하고 있는 것 같은 형태로 상태 관리를 하고 있는 기사는 보이지 않았기 때문에, 하나의 형태로서 남겨 본다.
실천 운용한 구성이 아니기 때문에, 추후, 실제로 사용해 본 소감을 추기할 예정.
「그 방법은 여기가 좋지 않아ー」등 있으면, 코멘트 부탁하고 싶습니다.
Reference
이 문제에 관하여(Flutter에서 유행 Riverpod를 사용해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tktcorporation/items/4e0b808bc3643b30c944텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)