Flutter响应式编程与MVVM架构插件easy_rxmvvm的使用
Flutter响应式编程与MVVM架构插件easy_rxmvvm的使用
easy_rxmvvm
是一个基于 rxdart
的 MVVM 框架,它可以帮助开发者更方便地实现响应式编程和管理 UI 状态。本文将通过示例来展示如何使用 easy_rxmvvm
插件。
示例
首先,让我们来看一下如何使用 easy_rxmvvm
来构建一个简单的应用。以下是一个完整的示例代码,展示了如何使用 easy_rxmvvm
创建一个带有登录状态的主页面,并列出一些演示项供用户点击。
// 忽略打印警告
import 'package:easy_rxmvvm/easy_rxmvvm.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:rxmvvm_example/bind/bind_page.dart';
import 'package:rxmvvm_example/event_bus/event_bus_page.dart';
import 'package:rxmvvm_example/paging/paging_page.dart';
import 'package:rxmvvm_example/todo/todo_list/todo_list_page.dart';
import 'package:rxmvvm_example/vm/login_vm.dart';
import 'counter/counter_page.dart';
import 'inherited/inherited_page.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// 定义演示项目列表
get demoList => [
DemoItem("共享", (context) => const InheritedPage()),
DemoItem("计数器", (context) => const CounterPage()),
DemoItem("双向绑定", (context) => const BindPage()),
DemoItem("分页请求", (context) => const PagingPage()),
DemoItem("EventBus", (context) => const EventBusPage()),
DemoItem("TodoList", (context) => const TodoListPage()),
];
@override
Widget build(BuildContext context) {
// 使用 ViewModelConsumer 构建 UI
return ViewModelConsumer(
creators: [
ViewModelFactory<LoginManagerViewModel>(() => LoginManagerViewModel())
],
shareStrategy: ViewModelShareStrategy.provider,
builder: (context, child) {
final loginViewModel = context.getViewModel<LoginManagerViewModel>();
if (loginViewModel == null) {
return const SizedBox.shrink();
}
// 构建主页面
return MaterialApp(
debugShowCheckedModeBanner: false,
builder: EasyLoading.init(),
home: Scaffold(
appBar: AppBar(
title: StreamBuilderFactory.buildBehavior(loginViewModel.isLogin,
builder: (context, value, _) {
return Text('登录状态: ${value ? '已登录' : '未登录'}');
}),
),
body: ListView.builder(
itemBuilder: (context, index) {
final item = demoList[index];
return ListTile(
title: Text(item.title),
onTap: () => item.push(context),
);
},
itemCount: demoList.length,
),
),
);
},
);
}
}
// 定义演示项类
class DemoItem {
final String title;
final WidgetBuilder builder;
DemoItem(this.title, this.builder);
void push(BuildContext context) {
Navigator.of(context).push(CupertinoPageRoute(builder: builder));
}
}
许可证
本项目采用 MIT 许可证。
代码块
为了方便在 VSCode 中使用代码块,您可以按照以下步骤进行配置:
- 打开 VSCode。
- 按下快捷键
Ctrl + Shift + P
打开命令面板。 - 输入
Snippets: Configure Snippets
并选择。 - 选择
dart.json
文件。 - 在
dart.json
文件中添加以下代码块:
{
"Consumer ViewModel": {
"prefix": "rxvmConsumers",
"description": "创建支持提供多个viewModel的StatefulWidget",
"body": [
"class $1 extends ViewModelConsumerStatefulWidget {",
"\tconst $1({super.key});",
"\n",
"\t@override",
"\tViewModelConsumerStateMixin<$1> createState() => _$1State();",
"}\n",
"class _$1State extends State<$1> with DisposeBagProvider, ViewModelConsumerStateMixin<$1> {",
"\t@override",
"\tWidget build(BuildContext context) {",
"\t\treturn Container();",
"\t}",
"\n",
"\t@override",
"\t// TODO: implement creaters",
"\tList<ViewModelFactory<ViewModel>> get creators => throw UnimplementedError();",
"}"
]
},
"Consumer SingleViewModel": {
"prefix": "rxvmConsumer",
"description": "创建支持提供单个viewModel的StatefulWidget",
"body": [
"class $1 extends ViewModelConsumerStatefulWidget {",
"\tconst $1({super.key});",
"\n",
"\t@override",
"\tViewModelConsumerStateMixin<$1> createState() => _$1State();",
"}\n",
"class _$1State extends State<$1> with DisposeBagProvider, ViewModelConsumerStateMixin<$1>, SingleViewModelMixin<$2, $1> {",
"\t@override",
"\tWidget build(BuildContext context) {",
"\t\treturn Container();",
"\t}",
"\n",
"\t@override",
"\t$2 viewModelCreate() => $2();",
"}"
]
},
"Consumer RetrieveViewModel": {
"prefix": "rxvmConsumerRetrive",
"description": "创建只获取单个viewModel的StatefulWidget",
"body": [
"class $1 extends ViewModelConsumerStatefulWidget {",
"\tconst $1({super.key});",
"\n",
"\t@override",
"\tViewModelConsumerStateMixin<$1> createState() => _$1State();",
"}\n",
"class _$1State extends State<$1> with DisposeBagProvider, ViewModelConsumerStateMixin<$1>, RetrieveViewModelMixin<$2, $1> {",
"\t@override",
"\tWidget build(BuildContext context) {",
"\t\treturn Container();",
"\t}",
"}"
]
},
"Rxvvm ViewModel Class": {
"prefix": "rxvmViewModel",
"description": "创建一个 ViewModel",
"body": [
"class $1ViewModel extends ViewModel {",
"\t@override",
"\tvoid config() {",
"\t\t// TODO: implement config",
"\t}",
"}"
]
},
"ViewModelFactory Creation": {
"prefix": "rxvmFactory",
"description": "创建一个 ViewModelFactory 实例",
"body": ["ViewModelFactory<${1:ViewModel}>(${2:() => ${1}()})"]
}
}
更多关于Flutter响应式编程与MVVM架构插件easy_rxmvvm的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter响应式编程与MVVM架构插件easy_rxmvvm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用easy_rxmvvm
插件来实现响应式编程与MVVM架构的代码示例。easy_rxmvvm
是一个简化MVVM架构实现的Flutter插件,它结合了RxDart库来实现响应式状态管理。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加easy_rxmvvm
和rxdart
的依赖:
dependencies:
flutter:
sdk: flutter
easy_rxmvvm: ^最新版本号 # 请替换为最新版本号
rxdart: ^最新版本号 # 请替换为最新版本号
2. 创建ViewModel
ViewModel负责业务逻辑和状态管理。使用RxState
和RxCommand
来管理状态和命令。
import 'package:easy_rxmvvm/easy_rxmvvm.dart';
import 'package:rxdart/rxdart.dart';
class CounterViewModel extends ViewModel {
final _count = BehaviorSubject<int>.seeded(0);
final incrementCommand = RxCommand.createAsyncNoParam(() async {
_count.value++;
});
Observable<int> getCount() => _count.asObservable();
}
3. 创建View(UI层)
在UI层中,我们将使用ViewModelProvider
来绑定ViewModel,并使用StreamBuilder
来监听状态变化。
import 'package:flutter/material.dart';
import 'package:easy_rxmvvm/easy_rxmvvm.dart';
import 'counter_view_model.dart'; // 导入上面创建的ViewModel
class CounterView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ViewModelProvider<CounterViewModel>(
createViewModel: () => CounterViewModel(),
builder: (context, viewModel, child) {
return Scaffold(
appBar: AppBar(
title: Text('Counter App'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
StreamBuilder<int>(
stream: viewModel.getCount(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
'${snapshot.data!}',
style: Theme.of(context).textTheme.headline4,
);
} else {
return Text('Loading...');
}
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => viewModel.incrementCommand.execute(),
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
},
);
}
}
4. 主函数入口
在主函数入口中,运行你的Flutter应用。
import 'package:flutter/material.dart';
import 'counter_view.dart'; // 导入上面创建的View
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CounterView(),
);
}
}
总结
以上代码展示了如何在Flutter中使用easy_rxmvvm
插件来实现MVVM架构和响应式编程。通过ViewModel
来管理业务逻辑和状态,并使用StreamBuilder
来监听状态的变化,从而实现UI的自动更新。希望这个示例能够帮助你理解和使用easy_rxmvvm
插件。