Flutter视图模型管理插件view_model_x的使用

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

Flutter视图模型管理插件view_model_x的使用

1. 安装和引入

首先,你需要在你的项目中安装 view_model_x 插件。打开终端或命令行工具,运行以下命令:

flutter pub add view_model_x

然后,在你的 pubspec.yaml 文件中添加依赖项:

dependencies:
  view_model_x: ^x.x.x

2. 示例代码

下面是一个完整的示例代码,展示了如何使用 view_model_x 插件来管理视图模型。

import 'package:flutter/material.dart';
import 'package:view_model_x/view_model_x.dart';

void main() {
  runApp(MyApp());
}

class CounterViewModel extends ViewModel {
  // 初始化 StateFlow
  final counterStateFlow = 1.stf();

  // 初始化 SharedFlow
  final messageSharedFlow = shf<String>();

  void increment() {
    // 通过更改值,监听器被通知
    counterStateFlow.value = counterStateFlow.value + 1;
  }

  void showPopupMessage() {
    // 通过发出值,监听器被通知
    messageSharedFlow.emit("Hello from CounterViewModel!");
  }

  @override
  void dispose() {
    // 必须释放所有流
    counterStateFlow.dispose();
    messageSharedFlow.dispose();
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个 widget 是你应用的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ViewModel Example',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        appBarTheme: AppBarTheme(
          color: Colors.blue.shade100,
        ),
        useMaterial3: true,
        colorSchemeSeed: Colors.blue,
      ),
      home: ViewModelProvider(
          create: (context) => CounterViewModel(), child: const HomePage()),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('ViewModel Example')),
      // 在代码中的任何地方实现 SharedFlowListener 来监听共享流的发出
      body: SharedFlowListener(
        // 传递你的共享流
        sharedFlow: context.vm<CounterViewModel>().messageSharedFlow,
        listener: (context, value) {
          // 获取发出的值。在这种情况下 <String>"Hello from ViewModel!"
          ScaffoldMessenger.of(context)
              .showSnackBar(SnackBar(content: Text(value)));
        },
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const MoreExamplesSection(),
            Expanded(
              child: Center(
                // 实现 ViewModelBuilder 来根据 StateFlow 值的变化/更新重建文本
                child: StateFlowBuilder(
                    // 传递你的 StateFlow
                    stateFlow: ViewModelProvider.of<CounterViewModel>(context)
                        .counterStateFlow,
                    builder: (context, value) {
                      return Text(
                        "$value",
                        style: const TextStyle(fontSize: 30),
                      );
                    }),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          IconButton(
            color: Theme.of(context).colorScheme.primary,
            onPressed: () {
              // 调用 CounterViewModel 中的 showPopupMessage 函数
              ViewModelProvider.of<CounterViewModel>(context)
                  .showPopupMessage();
            },
            icon: const Icon(Icons.mail_outline),
          ),
          const SizedBox(width: 12),
          FloatingActionButton(
            onPressed: () {
              // 调用 CounterViewModel 中的 increment 函数
              context.vm<CounterViewModel>().increment();
            },
            child: const Icon(Icons.add),
          ),
        ],
      ),
    );
  }
}

3. 使用说明

  • StateFlow:用于存储值并在其变化时通知监听器。可以改变值或更新值(对于列表或映射,需要更新现有对象而不是重新签名值)。

    myStateFlow.value = 5; // 监听器自动通知
    
  • SharedFlow:用于向监听器发送数据。可以发出值。

    mySharedFlow.emit("Hello from ViewModel!"); // 监听器自动通知
    
  • ViewModelProvider:用于包裹带有自定义 ViewModel 的的 widget。这需要 create 方法接受自定义 ViewModel 和子 widget。

    ViewModelProvider(
      create: (context) => counterViewModel, // 提供自定义 viewModel
      child: ChildWidget(),
    )
    
  • StateFlowBuilder:用于根据 StateFlow 的值变化/更新重建 widget。

    StateFlowBuilder(
      stateFlow: context.vm<CustomViewModel>().myStateFlow, // 传递 StateFlow
      builder: (context, value) {
        return ChildWidget(value); // 根据更新/变化的值重建 widget。
      },
    )
    
  • StateFlowConsumer:用于根据 StateFlow 的值变化/更新重建 widget 并调用监听器。

    StateFlowConsumer(
      stateFlow: ViewModelProvider.of<CustomViewModel>(context).myStateFlow, // 传递 StateFlow
      listener: (context, value) {
        // 根据值执行操作
      },
      builder: (context, value) {
        return ChildWidget(value); // 根据更新/变化的值重建 widget。
      },
    )
    
  • MultiFlowListener:合并多个 SharedFlowListener 和 StateFlowListener,提高可读性并消除多层监听器的需求。

    MultiFlowListener(
      providers: [
        SharedFlowListener(
          sharedFlow: context.vm<ViewModelA>().mySharedFlow,
          listener: (context, value) {
            // 根据值执行操作
          },
        ),
        StateFlowListener(
          stateFlow: context.vm<ViewModelA>().myStateFlow,
          listener: (context, value) {
            // 根据值执行操作
          },
        ),
        SharedFlowListener(
          sharedFlow: context.vm<ViewModelB>().anySharedFlow,
          listener: (context, value) {
            // 根据值执行操作
          },
        ),
      ],
      child: ChildA(),
    )
    
  • MultiProvider:将多个 ViewModelProvider、ChangeNotifierProvider 和/或 Provider widgets 合并为一个。

    MultiProvider(
      providers: [
        ViewModelProvider(
          create: (context) => ViewModelA(),
        ),
        ViewModelProvider(
          create: (context) => ViewModelB(),
        ),
        ChangeNotifierProvider(
          create: (context) => ChageNotifierA(),
        ),
      ],
      child: ChildA(),
    )
    

更多关于Flutter视图模型管理插件view_model_x的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视图模型管理插件view_model_x的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用view_model_x插件来管理视图模型的示例代码。view_model_x是一个流行的Flutter插件,用于在Flutter应用中实现MVVM(Model-View-ViewModel)架构模式。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加view_model_x的依赖:

dependencies:
  flutter:
    sdk: flutter
  view_model_x: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 创建ViewModel

接下来,创建一个ViewModel类,该类将包含业务逻辑和状态管理。例如,我们创建一个简单的计数器ViewModel:

// counter_view_model.dart
import 'package:flutter/material.dart';
import 'package:view_model_x/view_model_x.dart';

class CounterViewModel extends ViewModel {
  int _count = 0;
  final ValueNotifier<int> countNotifier = ValueNotifier(_count);

  void increment() {
    _count++;
    countNotifier.value = _count;
  }

  @override
  void dispose() {
    countNotifier.dispose();
    super.dispose();
  }
}

3. 绑定ViewModel到Widget

在你的Widget中使用ViewModelProvider来绑定ViewModel。例如,我们创建一个简单的计数器页面:

// counter_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_view_model.dart';

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ViewModelProvider<CounterViewModel>.withObservable(
      observable: () => CounterViewModel(),
      builder: (context, model, child) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Counter'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '${model.countNotifier.value}',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: model.increment,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      },
    );
  }
}

4. 使用CounterPage

最后,在你的主应用中使用CounterPage

// main.dart
import 'package:flutter/material.dart';
import 'counter_page.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CounterPage(),
    );
  }
}

总结

上述代码展示了如何在Flutter项目中使用view_model_x插件来管理视图模型。通过创建ViewModel类并绑定到Widget,你可以轻松实现MVVM架构模式,从而更好地组织和管理你的应用状态和业务逻辑。

回到顶部