Flutter媒体管理插件watermelon_mediator的使用

Flutter媒体管理插件watermelon_mediator的使用

Intro

这是一个简化包,它使你的代码风格更加简洁易读,并且让你的代码高度清洁。

它结合了中介者设计模式、单一职责原则和CQRS模式。

阅读前须知

让我通过一个例子来解释一下。 你有一个多层项目。 层A需要使用层B的一些服务。 每个服务都有其实现逻辑。 因此,你需要创建一个实例或使用依赖注入来调用层B的实现方法。

例如: 层A

car.getDate();
car.getName(carId);
car.getNameListBy(filter);

缺点:你需要导入多个实例以实现每种逻辑。

使用Watermelon Mediator…

首先,你将逻辑分离到单一职责,即一个类负责一个任务(在层B)。

然后,你将其注册到Mediator中,以便Mediator了解该任务。

最后,在你需要的地方调用Watermelon Mediator实例 _mediator.push(..) (在层A),Mediator实例会处理其余部分。

你可能问:push 方法如何识别相关的逻辑?

如果你查看上面的没有Mediator的例子代码,你会发现大多数时候,你有数据需要传递。现在,让我们使用这个数据模型类作为键:

final createCarCommand = createCarCommand(name, age);
_mediator.push(createCarCommand)

Watermelon Mediator有一个注册方法,可以让Mediator找到 'createCarCommand' 和其实施之间的关系。

总之,你遵循了这些设计模式,如下所示:

  1. Mediator作为一个中央实例管理者,用于不同层次或整个应用之间。
  2. 命令和查询模式根据你的应用程序任务设置目的。请求在Mediator中是一样的,就像写入一样,通过命名如 createCarCommand() ,读取也是如此,通过命名如 readCarInfoQuery() 。这是一个遵循的模式。
  3. 单一职责模式确保每个请求(Mediator中的命令或查询/写入或读取)只处理一个业务任务。

以上三点使得你的代码易于阅读、维护和扩展。

实现

安装

在命令行中输入:

flutter pub add watermelon_mediator

或者在 pubspec.yaml 文件中添加:

dependencies:
  watermelon_mediator: ^0.0.1
主要部分

该包有四个主要部分:

  1. Mediator实例
  2. 请求
  3. 请求处理器
  4. 将请求与请求处理器关联
如何轻松使用(Mediator实例)
final query = ExampleQuery();
final response = await _mediator.pushAsync(query);  
// 或者 ExampleCommand,这取决于你想要如何使用命令和查询模式,取决于你的业务逻辑
如何配置(请求与请求处理器)
class AddExampleCommand implements RequestModel<void> {
  AddExampleCommand({required this.data});

  final Data data;
}

RequestModel 模型是包的一部分,让包知道该示例类是一个‘请求’类型(识别的键)。请求类型类似于事件参数,可以携带数据。

下面是你的任务处理器和业务逻辑部分,你应该编写与目的相关的逻辑;例如,添加一辆车

class AddExampleCommandHandler implements RequestHandler<AddExampleCommand, void> {
  final mockCars = MockUpData();

  @override
  void handle(AddExampleCommand request) {
    // 如果你不写同步方法,可以省略
    throw UnimplementedError();
  }

  @override
  Future<void> handleAsync(AddExampleCommand request) {
    // 如果你不写异步方法,可以省略
    throw UnimplementedError();
  }
}

RequestHandler 接受泛型类型,一个是 RequestModel 另一个是 ResponseModel。你可以创建自定义的 ResponseModel 来拥有更清晰的代码。你的处理器类提供了两种 handle 方法,一种同步的,一种异步的。从逻辑上讲,如果你使用了一个,应该忽略另一个。

注册(将请求与请求处理器关联)
@MediatSRequest(requestName: 'AddCarRequest')
class AddExampleCommand...
@MediatSHandler(requestName: 'AddCarRequest')
class AddExampleCommandHandler...

上述注解 @MediatSRequest 让 WaterMelon Mediator 知道我们有一个请求类型,其键为 "requestName"

我们对处理器也使用相同的 requestName,所以 Mediator 将请求和请求处理器注册为相同的 "requestName"

记住,“requestName”在整个应用中对于每个发送到Mediator的请求应该是唯一的。

最后,你应该在 main.dart 类的 runApp(...); 方法顶部添加:

RequestsRegister();

然后运行以下命令:

dart run watermelon_mediator -path [WRITE THE SAVE LOCATION OF RequestsRegister() PATH]

注意: 你的路径应写成类似 lib/domain/watermelon_mediator 的格式。

你可以移除 -path 参数,它将在 lib 目录下生成 RequestsRegister 类。

如何使用(示例)

例如,在你的状态管理器或其他任何部分,如果你想调用一个服务或逻辑,你可以导入 watermelon_mediator 包。通过传递请求模型,它可以自动找到处理器并将结果返回给你。

class CarStateManager {
  final _mediator = Mediator();

  Future<List<Car>> getCarList() async {
    final query = CarListQuery(pageIndex: 0, orderNum: 2);
    final response = await _mediator.pushAsync(query);
    return response.cars;
  }

  void addCar(String name) {
    final command = AddCarCommand(car: car);
    _mediator.push(command);
  }
}

更多关于Flutter媒体管理插件watermelon_mediator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,下面是一个关于如何使用Flutter中的watermelon_mediator插件进行媒体管理的示例代码。watermelon_mediator是一个假设的插件名称,用于示范目的,因为实际上并没有一个直接名为watermelon_mediator的广泛使用的Flutter媒体管理插件。不过,我们可以模拟一个类似的插件功能,比如管理音频或视频文件的播放、暂停和停止。

在实际开发中,你可能会使用如just_audiovideo_player等Flutter插件来管理媒体。这里,我将提供一个简化的示例,模拟如何使用一个媒体管理插件。

假设的watermelon_mediator插件使用示例

首先,确保你已经在pubspec.yaml文件中添加了相应的依赖项(这里以just_audio为例,因为它是一个非常流行的音频管理插件):

dependencies:
  flutter:
    sdk: flutter
  just_audio: ^0.10.0 # 请检查最新版本号

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

接下来,在你的Flutter项目中创建一个简单的界面来管理媒体播放。

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

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

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

class MediaManagerScreen extends StatefulWidget {
  @override
  _MediaManagerScreenState createState() => _MediaManagerScreenState();
}

class _MediaManagerScreenState extends State<MediaManagerScreen> {
  final AudioPlayer _player = AudioPlayer();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Media Manager Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 假设我们有一个音频文件的URL
                final String audioUrl = 'https://example.com/audio.mp3';
                await _player.setAudioSource(UriAudioSource(Uri.parse(audioUrl)));
                await _player.play();
              },
              child: Text('Play Audio'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                await _player.pause();
              },
              child: Text('Pause Audio'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                await _player.stop();
              },
              child: Text('Stop Audio'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 释放音频播放器资源
    _player.dispose();
    super.dispose();
  }
}

解释

  1. 依赖项:我们在pubspec.yaml文件中添加了just_audio插件。
  2. 主应用MyApp类是我们的主应用类,它创建了一个MaterialApp并设置了首页为MediaManagerScreen
  3. 媒体管理屏幕MediaManagerScreen是一个有状态的Widget,它包含了三个按钮来控制音频的播放、暂停和停止。
  4. 音频播放器:我们创建了一个AudioPlayer实例来管理音频播放。
  5. 按钮操作:每个按钮都调用AudioPlayer的相应方法来控制音频。
  6. 资源释放:在dispose方法中,我们释放了AudioPlayer实例以节省资源。

这个示例展示了如何使用一个假设的媒体管理插件(在这里用just_audio代替)来管理音频文件的播放。你可以根据实际需要调整代码,比如处理视频文件或添加更多的媒体管理功能。

回到顶部