You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flutter游戏模板中的ProxyProvider2转换为Riverpod?

将ProxyProvider2转换为Riverpod实现

以下是完全匹配原ProxyProvider2逻辑的Riverpod实现方案,覆盖初始化、依赖更新、资源销毁及非懒加载需求:

1. 定义依赖Provider

先通过Riverpod暴露SettingsController和App生命周期状态通知器:

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

// SettingsController的Provider
final settingsControllerProvider = Provider<SettingsController>((ref) {
  // 替换为你原有的SettingsController创建逻辑
  return SettingsController();
});

// App生命周期状态通知器的Provider
final appLifecycleNotifierProvider = Provider<ValueNotifier<AppLifecycleState>>((ref) {
  final notifier = ValueNotifier(AppLifecycleState.resumed);
  // 此处添加监听App生命周期变化的逻辑(原模板已有对应实现)
  return notifier;
});

2. 实现AudioController的Provider

创建AudioController的Provider,处理依赖绑定、更新监听及销毁逻辑:

final audioControllerProvider = Provider<AudioController>((ref) {
  // 获取两个依赖实例
  final settings = ref.watch(settingsControllerProvider);
  final lifecycleNotifier = ref.watch(appLifecycleNotifierProvider);

  // 创建并初始化AudioController
  final audioController = AudioController()..initialize();

  // 初始绑定依赖
  audioController.attachSettings(settings);
  audioController.attachLifecycleNotifier(lifecycleNotifier);

  // 监听Settings变化,自动重新绑定
  ref.listen(settingsControllerProvider, (_, newSettings) {
    audioController.attachSettings(newSettings);
  });

  // 监听生命周期通知器变化,自动重新绑定
  ref.listen(appLifecycleNotifierProvider, (_, newNotifier) {
    audioController.attachLifecycleNotifier(newNotifier);
  });

  // 注册销毁回调
  ref.onDispose(() => audioController.dispose());

  return audioController;
});

3. 实现非懒加载(对应原lazy: false)

要让AudioController在App启动时立即创建而非按需加载,在main函数中提前读取该Provider:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 创建Provider容器并提前初始化AudioController
  final container = ProviderContainer();
  container.read(audioControllerProvider);

  runApp(
    UncontrolledProviderScope(
      container: container,
      child: const YourGameApp(),
    ),
  );
}

逻辑对应说明

  • 原lazy: false:通过main函数中提前调用container.read实现,确保实例在启动时立即初始化,音乐可立刻播放。
  • 原create:对应Provider的create回调,负责AudioController的创建与初始化。
  • 原update:通过ref.listen监听两个依赖的变化,当依赖更新时自动执行重新绑定逻辑。
  • 原dispose:通过ref.onDispose注册销毁回调,在Provider实例被销毁时自动调用audioController.dispose()。

内容的提问来源于stack exchange,提问作者Mosh Mobile Software Engineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:25:39