Flutter视图模型宏定义插件view_model_macro的使用
Flutter视图模型宏定义插件view_model_macro的使用
使用Dart宏支持ViewModel工具。
✨ 特性
StateNotifier
带有私有状态和发射器以及公共流。ActionNotifier
可选通知器带有私有发射器和公共流。Dispose
自动处理从ViewModel声明的所有通知器。
🧑💻 示例
import 'package:view_model_macro/view_model_macro.dart';
@ViewModel()
class Counter {
final StateNotifier<int> _count = StateNotifier(0);
void add() => _emitCount(_countValue + 1);
void subtract() => _emitCount(_countValue - 1);
}
void main() {
runApp(const MainApp());
}
class MainApp extends StatefulWidget {
const MainApp({super.key});
[@override](/user/override)
State<MainApp> createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> {
// 声明ViewModel
final counter = Counter();
[@override](/user/override)
void dispose() {
// 需要时进行清理
counter.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => counter.add(),
),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 从流中收集数据并基于其数据构建小部件
counter.countStream.collectAsWidget(
(value) {
return Text('Count: $value');
},
),
],
),
),
),
);
}
}
🚀 快速开始
-
在
pubspec.yaml
中添加package:view_model_macro
dependencies: view_model_macro: any
-
在
analysis_options.yaml
中启用实验性宏analyzer: enable-experiment: - macros
-
使用
@ViewModel
注解(见上面示例)。 -
运行项目
flutter run --enable-experiment=macros
需要 Dart SDK >= 3.5.0
示例代码
import 'package:example/calculator.dart';
import 'package:flutter/material.dart';
import 'package:view_model_macro/view_model_macro.dart';
void main() {
runApp(const MainApp());
}
class MainApp extends StatefulWidget {
const MainApp({super.key});
[@override](/user/override)
State<MainApp> createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> {
final counter = Calculator();
[@override](/user/override)
void dispose() {
super.dispose();
}
void _onShowSnackBar(BuildContext context) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Show SnackBar from ActionNotifier')),
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => counter.add(),
),
body: Builder(builder: (context) {
return counter.showSnackBarStream.collectAsListener(
onData: (_) => _onShowSnackBar(context),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
counter.countStream.collectAsWidget(
(value) {
return Text('Count: $value');
},
),
],
),
),
);
}),
),
);
}
}
更多关于Flutter视图模型宏定义插件view_model_macro的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视图模型宏定义插件view_model_macro的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter中的view_model_macro
插件的示例代码。这个插件假设是用于简化视图模型(ViewModel)的创建和管理,尽管这不是一个官方或广泛认可的插件,我会基于一个假设的API来展示如何使用它。请注意,具体的API和用法可能有所不同,以下代码仅作为示例。
首先,你需要确保你的pubspec.yaml
文件中已经添加了view_model_macro
依赖:
dependencies:
flutter:
sdk: flutter
view_model_macro: ^x.y.z # 替换为实际的版本号
然后运行flutter pub get
来获取依赖。
接下来,我们假设view_model_macro
提供了一个宏定义来简化ViewModel的创建。以下是一个可能的实现示例:
1. 定义ViewModel基类
通常,你会有一个ViewModel基类,它可能包含一些共享的状态管理逻辑:
import 'package:flutter/material.dart';
abstract class BaseViewModel extends ChangeNotifier {
// 可以在这里添加一些共享的逻辑或方法
}
2. 使用宏定义创建ViewModel
假设view_model_macro
提供了一个宏defineViewModel
,用于快速生成ViewModel类。以下是一个如何使用这个宏的示例:
import 'package:view_model_macro/view_model_macro.dart';
part 'counter_view_model.g.dart'; // 生成的代码文件
@defineViewModel()
class CounterViewModel extends BaseViewModel {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
注意:这里的@defineViewModel()
宏是假设存在的,并且它会生成一些必要的代码到counter_view_model.g.dart
文件中。实际上,这种宏处理可能涉及构建时代码生成,这通常是通过像build_runner
这样的工具来实现的。
3. 使用生成的ViewModel
在你的Flutter组件中,你可以像使用普通的ViewModel一样使用这个宏生成的ViewModel:
import 'package:flutter/material.dart';
import 'counter_view_model.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<CounterViewModel>(
create: (_) => CounterViewModel(),
child: MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Counter App'),
),
body: Center(
child: CounterWidget(),
),
),
),
);
}
}
class CounterWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final CounterViewModel model = Provider.of<CounterViewModel>(context);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${model.count}',
style: Theme.of(context).textTheme.headline4,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: model.increment,
child: Text('Increment'),
),
],
);
}
}
注意
-
宏和代码生成:实际的宏处理和代码生成可能会涉及更复杂的设置,比如使用
build_runner
。由于Flutter和Dart的生态系统在不断变化,具体的实现细节可能会有所不同。 -
插件可用性:请注意,
view_model_macro
这个插件名称是虚构的,用于说明目的。在实际项目中,你可能需要找到一个合适的插件或自己实现类似的功能。 -
状态管理:Flutter中有多种状态管理解决方案,如
Provider
、Riverpod
、Bloc
等。根据你的项目需求选择合适的方案。
希望这个示例能帮助你理解如何使用一个假设的view_model_macro
插件来简化ViewModel的创建和管理。如果你有更具体的需求或插件,请提供更多细节以便给出更准确的帮助。