Flutter服务提供插件dart_service_provider的使用

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

Flutter服务提供插件dart_service_provider的使用

dart_service_provider

pub package CI Last Commits Pull Requests Code size License

A services dependency provider, like dependency inject, easy to learn and easy to use.

特性

提供服务生命周期控制,包括单例、作用域、瞬态。

入门

void main() {
  final services = ServiceCollection()
  // 添加默认的日志服务
    ..addLogging()
    ..addSingleton<IMySingletonService, MySingletonService>((_) => MySingletonService())
    ..addScoped<IMyScopedService, MyScopedService>((_) => MyScopedService())
    ..addTransient<IMyTransientService, MyTransientService>((_) => MyTransientService())
    ..addScoped<MyScopedDependencyService, MyScopedDependencyService>(
          (p) =>
          MyScopedDependencyService(
            singletonService: p.getRequiredService<IMySingletonService>(),
            scopedService: p.getRequiredService<IMyScopedService>(),
            transientService: p.getRequiredService<IMyTransientService>(),
          ),
    );

  final serviceProvider = services.buildServiceProvider();
  final singletonService = serviceProvider.getRequiredService<IMySingletonService>();
  final transientService = serviceProvider.getRequiredService<IMyTransientService>();
  // 作用域
  final scope = serviceProvider.createScope();
  final singletonService2 = scope.serviceProvider.getRequiredService<IMySingletonService>();
  assert(identical(singletonService, singletonService2));
  final scopedService = scope.serviceProvider.getRequiredService<IMyScopedService>();
  final scopedService2 = scope.serviceProvider.getRequiredService<IMyScopedService>();
  assert(identical(scopedService, scopedService2));
  final transientService2 = scope.serviceProvider.getRequiredService<IMyTransientService>();
  assert(!identical(transientService, transientService2));
  // 总是在不再需要时释放作用域
  // 这将清理此作用域及其服务所使用的任何资源
  // 对于异步调用有一个 `disposeAsync()` 方法
  // 注意:`dispose` 方法来自接口 `IDisposable` 和 `disposeAsync` 来自接口 `IAsyncDisposable`
  // 由 `IServiceProvider` 构建的任何实现 `IDisposable` 或 `IAsyncDisposable` 的服务在其生命周期结束时将自动被释放
  scope.dispose();

  // 总是在不再需要时释放 ServiceProvider
  // 也有一个 `disposeAsync()` 方法
  serviceProvider.dispose();
}

使用

void main() {
  final services = ServiceCollection();
  services.addSingleton&lt;MyService, MyService&gt;((_) =&gt; MyService());
  final rootProvider = services.buildServiceProvider();
  final myService = rootProvider.getRequiredService&lt;MyService&gt;();
  // myService.foo()
}

class MyService {}

日志记录

启用默认日志记录

final services = ServiceCollection()
// 添加默认的日志服务
  ..addLogging();

自定义日志记录

final services = ServiceCollection()
// 添加默认的日志服务
  ..addLogging((loggingBuilder) {
    // 自定义你的日志服务
  });

如何自定义日志服务:

  • 实现 ILoggerFactory 接口,然后在 ServiceCollection 上调用 addLogging 扩展方法,并指定 config 参数。
  • 可选实现 ILoggerILogger4 接口,推荐实现 ILogger4
  • 如果你的实现不需要 LoggerOptions 服务,请调用 LoggingBuilderExtensions.removeOptions 扩展方法删除它。

环境

提供环境服务。

void main() {
  final services = ServiceCollection();
  // 添加环境服务
  services.addEnvironment&lt;Evironment&gt;(Environment(name: Environments.production));
  final provider = services.buildServiceProvider();
  final env = provider.getRequiredService&lt;IEnvironment&gt;();
  print(env.isProduction); // true
}

更多关于Flutter服务提供插件dart_service_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务提供插件dart_service_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用dart_service_provider插件的示例代码。这个插件通常用于在应用内提供服务和数据。假设我们有一个简单的服务,用于提供用户信息。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加dart_service_provider的依赖(注意:实际使用时请确认插件的准确名称和版本):

dependencies:
  flutter:
    sdk: flutter
  dart_service_provider: ^x.y.z  # 请替换为实际版本号

然后运行flutter pub get来获取依赖。

2. 创建服务类

接下来,我们创建一个服务类,比如UserService,用于提供用户信息。

// user_service.dart
import 'package:dart_service_provider/dart_service_provider.dart';

class UserService implements Service {
  String getUserName() {
    return "John Doe";
  }

  String getUserEmail() {
    return "john.doe@example.com";
  }
}

3. 注册服务

然后,我们需要在应用的入口文件中(通常是main.dart)注册这个服务。

// main.dart
import 'package:flutter/material.dart';
import 'package:dart_service_provider/dart_service_provider.dart';
import 'user_service.dart';

void main() {
  // 创建ServiceProvider实例并注册服务
  ServiceProvider.create(child: MyApp(), builder: (context) {
    return [
      ServiceProviderItem(UserService()),
    ];
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: UserInfoScreen(),
    );
  }
}

4. 使用服务

现在,我们可以在任何需要的地方使用ServiceProvider.of(context)来获取并使用这个服务。

// user_info_screen.dart
import 'package:flutter/material.dart';
import 'package:dart_service_provider/dart_service_provider.dart';

class UserInfoScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final userService = ServiceProvider.of<UserService>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('User Info'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Name: ${userService.getUserName()}'),
            SizedBox(height: 16),
            Text('Email: ${userService.getUserEmail()}'),
          ],
        ),
      ),
    );
  }
}

5. 运行应用

确保所有文件保存无误后,运行你的Flutter应用:

flutter run

这样,你的Flutter应用就应该能够显示用户信息了,这是通过dart_service_provider插件提供的服务实现的。

注意事项

  • dart_service_provider插件的实际名称和API可能有所不同,请查阅最新的官方文档。
  • 确保服务在使用前已被正确注册,否则ServiceProvider.of<T>(context)将返回null,可能导致运行时错误。
  • 考虑到依赖注入的灵活性,你可以根据需要注册多个服务,并在应用的不同部分使用它们。
回到顶部