Flutter视图模型宏定义插件view_model_macro的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter视图模型宏定义插件view_model_macro的使用

pub package License: MIT

使用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');
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

🚀 快速开始

  1. pubspec.yaml中添加package:view_model_macro

    dependencies:
      view_model_macro: any
    
  2. analysis_options.yaml中启用实验性宏

    analyzer:
      enable-experiment:
        - macros
    
  3. 使用@ViewModel注解(见上面示例)。

  4. 运行项目

    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

1 回复

更多关于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'),
        ),
      ],
    );
  }
}

注意

  1. 宏和代码生成:实际的宏处理和代码生成可能会涉及更复杂的设置,比如使用build_runner。由于Flutter和Dart的生态系统在不断变化,具体的实现细节可能会有所不同。

  2. 插件可用性:请注意,view_model_macro这个插件名称是虚构的,用于说明目的。在实际项目中,你可能需要找到一个合适的插件或自己实现类似的功能。

  3. 状态管理:Flutter中有多种状态管理解决方案,如ProviderRiverpodBloc等。根据你的项目需求选择合适的方案。

希望这个示例能帮助你理解如何使用一个假设的view_model_macro插件来简化ViewModel的创建和管理。如果你有更具体的需求或插件,请提供更多细节以便给出更准确的帮助。

回到顶部