#그룹 모델ဆိုတာဘာလဲ?
သူရဲ့ အဓိက ရည်ရွယ်ချက်ကတော့ 신청하다.မှာပါတဲ့ 상업 논리ကို
bloc_pattern: ^2.5.1
နဲ့ ရေးကြည့်မယ်ဆိုရင် ခုလိုမျိုး ထွက်လာမယ်။import 'dart:async';
import 'package:bloc_pattern/bloc_pattern.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: BlocProvider(
blocs: [Bloc((i) => IncrementBloc())],
child: CounterPage(),
),
);
}
}
class CounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = BlocProvider.getBloc<IncrementBloc>();
return Scaffold(
appBar: AppBar(
title: Text('Counter with Stream'),
),
body: Center(
child: StreamBuilder(
stream: bloc.outCounter,
initialData: 0,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
return Text('You pressed me ${snapshot.data} times');
},
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
bloc.incrementCounter.add(null);
},
),
);
}
}
class IncrementBloc extends BlocBase {
int _counter;
//
// Stream to handle the counter
//
StreamController<int> _counterController = StreamController<int>();
StreamSink<int> get _inAdd => _counterController.sink;
Stream<int> get outCounter => _counterController.stream;
//
// Stream to handle the action on the counter
//
StreamController _actionController = StreamController();
StreamSink get incrementCounter => _actionController.sink;
//
// Constructor
//
IncrementBloc() {
_counter = 0;
_actionController.stream.listen(_handleLogic);
}
void dispose() {
_actionController.close();
_counterController.close();
}
void _handleLogic(data) {
_counter = _counter + 1;
_inAdd.add(_counter);
}
}
상업 논리အကုန်ကလဲ 점증 그룹ထဲမှာ တစုတစည်းထဲဖြစ်သွားတယ်။ 상업 논리ပြောင်းဖို့လိုမယ်ဆို တနေရာထဲမှာ ပြောင်းပေးလိုက်ရုံပဲ ဖြစ်သွားမယ်။
테스트 가능성(678)457
상업 논리ကို 테스트လုပ်ရတာလဲ ပိုမို လွယ်ကူသွားမယ်။ 사용자 인터페이스ကနေတဆင့် လုပ်နေစရာမလိုတော့ဘဲ 점증 그룹တခုကို 테스트လုပ်ရုံနဲ့တင် ရသွားမယ်။
setState()
ကိုမသုံးဘဲ StreamBuilder
ကိုသုံးခြင်းအားဖြင့် 짓다လုပ်ရတဲ့ အကြိမ်အရေအတွက်ကို အများကြီး လျှော့ချပြီးသား ဖြစ်သွားတယ်။ တကယ်လိုအပ်တဲ့အချိန်မှပဲ ပြန်ပြီး 짓다လုပ်ဖို့ လိုအပ်တယ်။ 표현ဘက်က ကြည့်မယ်ဆို ဒါဟာ ကြီးမားတဲ့ တိုးတက်မှုဖြစ်တယ်။ဒါတွေအကုန် အလုပ်လုပ်ဖို့ဆို 그룹ကို နေရာတိုင်းက အသုံးပြုလို့ရနေဖို့လိုအပ်တယ်။ ဒီလိုလုပ်ထားဖို့ နည်းလမ်း (၃)ခုရှိတယ်။
글로벌 싱글
로컬 인스턴스
dispose()
ထဲမှာ 로컬 인스턴스ကို ပြန်ပြီး ဖျက်ပစ်လို့ရမယ်။import 'package:flutter/material.dart';
// Generic Interface for all BLoCs
abstract class BlocBase {
void dispose();
}
// Generic BLoC Provider
class BlocProvider<T extends BlocBase> extends StatefulWidget {
final T bloc;
final Widget child;
BlocProvider({
Key key,
@required this.child,
@required this.bloc,
}) : super(key: key);
@override
State<StatefulWidget> createState() => _BlocProviderState<T>();
static T of<T extends BlocBase>(BuildContext context) {
BlocProvider<T> provider =
context.findAncestorWidgetOfExactType<BlocProvider<T>>();
return provider.bloc;
}
}
class _BlocProviderState<T> extends State<BlocProvider<BlocBase>> {
@override
void dispose() {
widget.bloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
bloc 모드 라이브러리သုံးထားတဲ့နေရာမှာ ခု 그룹 모델ကို သုံးလို့ရပြီ။ ခုလိုရေးတာက 선조ကနေတဆင့် ပို့ပေးတဲ့ နည်းလမ်းကို အသုံးပြုထားခြင်းဖြစ်တယ်။import 'dart:async';
import 'package:flutter/material.dart';
import 'bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: BlocProvider(
bloc: IncrementBloc(),
child: CounterPage(),
),
);
}
}
class CounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = BlocProvider.of<IncrementBloc>(context);
return Scaffold(
appBar: AppBar(
title: Text('Counter with Stream'),
),
body: Center(
child: StreamBuilder(
stream: bloc.outCounter,
initialData: 0,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
return Text('You pressed me ${snapshot.data} times');
},
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
bloc.incrementCounter.add(null);
},
),
);
}
}
class IncrementBloc implements BlocBase {
int _counter;
//
// Stream to handle the counter
//
StreamController<int> _counterController = StreamController<int>();
StreamSink<int> get _inAdd => _counterController.sink;
Stream<int> get outCounter => _counterController.stream;
//
// Stream to handle the action on the counter
//
StreamController _actionController = StreamController();
StreamSink get incrementCounter => _actionController.sink;
//
// Constructor
//
IncrementBloc() {
_counter = 0;
_actionController.stream.listen(_handleLogic);
}
void dispose() {
_actionController.close();
_counterController.close();
}
void _handleLogic(data) {
_counter = _counter + 1;
_inAdd.add(_counter);
}
}
BlocProviderကို ဘယ်လို လုပ်သလဲဆိုhome: BlocProvider(
bloc: IncrementBloc(),
child: CounterPage(),
),
ဒီနေရာမှာ 공급자တခုကို တည်ဆောက်ပြီး အဲ့ဒီ့ 공급자ကနေ ပို့ပေးမယ့် 그룹(증가 그룹)ကို တည်ဆောက်တယ်။ IncrementBloc()
ကို သုံးမယ့် CounterPage()
ကိုလဲ 아이.ထဲမှာ တခါထဲ ကြေငြာသွားတယ်။ဒီလို ကြေငြာပြီးတာနဲ့ BlocProviderအောက်မှာ ရှိတဲ့ 자수အကုန်လုံးကနေ ကြိုက်တဲ့နေရာမှာ 점증 그룹ကို ယူသုံးလို့ရပြီ။
그룹တွေအများကြီးကို သုံးလို့ရသလားဆိုရင်တော့ ရတယ်လို့ပဲ ဖြေပေးရမယ်။ အသုံးပြုဖို့ တိုက်တွန်းချင်တဲ့ နေရာတွေကတော့
Reference
이 문제에 관하여(#그룹 모델ဆိုတာဘာလဲ?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/arkarmintun1/bloc-pattern-5hmg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)