Search code examples
flutterdartriverpodflutter-riverpod

Provider to Riverpod


So I am using the Flutter game template, which I found this:

 ProxyProvider2<SettingsController, ValueNotifier<AppLifecycleState>,
              AudioController>(
            // Ensures that the AudioController is created on startup,
            // and not "only when it's needed", as is default behavior.
            // This way, music starts immediately.
            lazy: false,
            create: (context) => AudioController()..initialize(),
            update: (context, settings, lifecycleNotifier, audio) {
              if (audio == null) throw ArgumentError.notNull();
              audio.attachSettings(settings);
              audio.attachLifecycleNotifier(lifecycleNotifier);
              return audio;
            },
            dispose: (context, audio) => audio.dispose(),
          ),

But unfortunately, I don't like provider. How to convert this provider to riverpod?


Solution

  • An equivalent in Riverpod would be:

    final settingsProvider = Provider<SettingsController>(...);
    final appLifecycleStateProvider = Provider<ValueNotifier<AppLifecycleState>>(...);
    
    
    final audioControllerProivder = Provider<AudioController>((ref) {
      final audio = AudioController()..initialize();
      ref.onDispose(audio.dispose);
    
      ref.listen<SettingsController>(settingsProvider, (prev, next) {
        audio.attachSettings(next);
      });
      ref.listen<ValueNotifier<AppLifecycleState>>(appLifecycleStateProvider, (prev, next) {
        audio.attachLifecycleNotifier(next);
      });
    
      return audio;
    });
    

    Although it's possible that there are ways to simplify this further by using ref.watch. But the snippet above should be a good start