Flutter插件vessel_flutter的使用_vessel是一个用于依赖注入(Dependency Injection)的库

Flutter插件vessel_flutter的使用_vessel是一个用于依赖注入(Dependency Injection)的库

vessel 是一个用于依赖注入(Dependency Injection)的库。在 Flutter 中使用 vessel_flutter 可以帮助我们更好地管理应用中的状态和依赖关系。

开始使用vessel_flutter

首先,你需要将你的应用包装在一个 ProviderScope 小部件中:

void main() {
  runApp(
    ProviderScope(child: App())
  );
}

然后,你可以通过 of 扩展方法来读取你的提供商:

GestureDetector(
  onTap: () => myProvider.of(context).doSomething(),
  child: ...,
);

每个 ProviderScope 都会引入一个新的 ProviderContainer,该容器将成为前一个容器的子容器。当 ProviderScope 小部件被释放时,它也会释放相应的 ProviderContainer

覆盖和作用域

你可以用另一个提供商覆盖当前提供商:

ProviderScope(
  overrides: [
    myProvider.overrideWith(anotherProvider),
  ],
  child: ...,
)

或者只是对提供商进行作用域限定:

ProviderScope(
  overrides: [
    myProvider.scope(),
  ],
  child: ...,
)

传递父级

ProviderScope 会从 BuildContext 中获取其父级。但你可以通过 parent 构造函数参数来覆盖它。这在处理对话框时非常有用:

ProviderScope(
  overrides: [myVmProvider.scoped()],
  child: Builder(
    builder: (context) => GestureDetector(
      onTap: () {
        final container = UncontrolledProviderScope.of(context);
        showAlertDialog(
          builder: (context) => ProviderScope(
            parent: container,
            child: ...,
          ),
        );
      },
      child: ...,
    ),
  ),
)

这样,你的对话框就会接收来自父屏幕的所有作用域提供商。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 vessel_flutter 插件来管理状态和依赖关系。

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

// 定义一个提供商
final provider = Provider((read) => ValueNotifier(0));

void main() {
  // 应用程序入口
  runApp(
    ProviderScope(
      adapters: [ValueNotifierAdapter()],
      child: provider.builder(
        builder: (_, value, __) => Text("$value"),
      ),
    ),
  );
}

// 自定义适配器
class ValueNotifierAdapter extends ProviderAdapter<ValueNotifier> {
  [@override](/user/override)
  void dispose(ValueNotifier providerValue) {
    // 在适配器中释放资源
    providerValue.dispose();
  }
}

// 扩展 ProviderBase 类,添加 builder 方法
extension<T> on ProviderBase<ValueNotifier<T>> {
  Widget builder({required ValueWidgetBuilder<T> builder}) =>
      _ValueNotifierProviderBuilder(
        provider: this,
        builder: builder,
      );
}

// 自定义小部件
class _ValueNotifierProviderBuilder<T> extends StatelessWidget {
  final ProviderBase<ValueNotifier<T>> provider;
  final ValueWidgetBuilder<T> builder;
  final Widget? child;

  const _ValueNotifierProviderBuilder({
    super.key,
    required this.builder,
    required this.provider,
    this.child,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 使用 ValueListenableBuilder 来监听 ValueNotifier 的变化
    return ValueListenableBuilder(
      valueListenable: provider.of(context),
      builder: builder,
      child: child,
    );
  }
}

更多关于Flutter插件vessel_flutter的使用_vessel是一个用于依赖注入(Dependency Injection)的库的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部