Flutter插件viper的使用方法介绍
Flutter插件viper的使用方法介绍
VIPER
一种优雅的方式将VIPER架构引入到Flutter项目中。
示例代码
import 'package:flutter/material.dart' hide Router;
import 'package:viper/viper.dart';
// 定义视图接口
abstract class MyHomeView extends View {
BehaviorSubject<int> get counter;
Stream<void> get incrementButtonDidTap;
}
// 定义交互器
class CounterInteractor extends Interactor {
var _counter = 0;
int get counter => _counter;
Stream<int> increment() {
_counter++;
return Stream.value(_counter);
}
}
// 定义路由
class MyHomeRouter extends Router {}
// 定义呈现器
class MyHomePresenter extends Presenter<MyHomeView, MyHomeRouter> {
late final counterInteractor = CounterInteractor();
[@override](/user/override)
void onReady() {
super.onReady();
// 绑定视图和交互器的数据流
MergeStream([
view.stateDidInit.map((event) => counterInteractor.counter),
view.incrementButtonDidTap.flatMap((value) => counterInteractor.increment())
])
.bind(view.counter)
.addTo(disposeBag);
}
}
// 定义模块
class MyHomeModule extends Module<MyHomeView, MyHomePresenter, MyHomeRouter> {
[@override](/user/override)
final presenter = MyHomePresenter();
[@override](/user/override)
final router = MyHomeRouter();
[@override](/user/override)
Widget build(BuildContext context) {
return MyHomeViewImpl();
}
}
void main() {
runApp(MyApp());
}
// 主应用
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomeModule(),
);
}
}
// 视图实现
class MyHomeViewImpl extends StatefulWidget {
MyHomeViewImpl({Key? key}) : super(key: key);
[@override](/user/override)
_MyHomeViewImplState createState() => _MyHomeViewImplState();
}
class _MyHomeViewImplState extends ViewState<MyHomeViewImpl, MyHomeModule> implements MyHomeView {
[@override](/user/override)
final counter = BehaviorSubject<int>.seeded(0);
[@override](/user/override)
BehaviorSubject<void> incrementButtonDidTap = BehaviorSubject();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Example"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You have pushed the button this many times:'),
StreamBuilder<int>(
stream: counter,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
'${snapshot.data}',
style: Theme.of(context).textTheme.headline4,
);
} else {
return Text('0');
}
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => incrementButtonDidTap.add(null),
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
更多关于Flutter插件viper的使用方法介绍的实战教程也可以访问 https://www.itying.com/category-92-b0.html