【问题标题】:Clean solution for Rive and RiverpodRive 和 Riverpod 的清洁解决方案
【发布时间】:2021-06-01 12:26:08
【问题描述】:

在我的 Flutter 应用程序中,我想使用 Rive 进行动画处理,使用 Riverpod 进行状态管理。所以现在我正在寻找一种高性能的方式来监听我的提供者的状态来管理我的SMIInput<bool> 的状态。目前我用消费者包装 Rive 小部件,以从 Riverpod 获取状态并设置控制器值。

Consumer(builder: (context, watch, _) {
  _smile?.value = watch(widget._stateRef).smile;
  return Rive(
    artboard: _riveArtboard!,
  );
});

我想这会在设置_smile.value 并返回小部件后运行 Rive 小部件的构建方法。

- 我说对了吗?

为此,我尝试将 addListener 调用到提供程序通知程序以在此处设置 _smile.value

context.read(widget._stateRef.notifier).addListener((logoState) {
   if (mounted) {
     _smile?.value = logoState.smile;
   }
});

但这只会运行一次,而不是像我希望的那样在每次状态更改时运行。

- 是否有其他建议可以在无需使用 Consumer 的情况下更改控制器输入值?

final signInLogoSmileProvider =
    StateNotifierProvider<LogoNotifier, LogoState>((ref) {
  // ignore: unused_local_variable
  ref.watch(signInFormProvider);
  final signInFormNotifier = ref.read(signInFormProvider.notifier);
  return LogoNotifier(smile: signInFormNotifier.shouldSmile);
});

我需要查看 signInFormProviders 状态而不是 signInFormProvider.notifiers 状态,原因与 addListeners 只运行一次的原因相同。

- 这是不好的做法,还是我在这里做错了什么?

如果您有任何很好的 Rive 和 Riverpod 携手合作,我将不胜感激。

【问题讨论】:

    标签: flutter riverpod rive


    【解决方案1】:

    我正在使用更新版本的 Riverpod 和 Rive,但您可以通过使用 ConsumerStatefulWidget 然后使用 ref.listen 监听值的变化,然后将值设置为 SMIBool 来轻松完成。

    //...
    late SMIBool _smile;
    //...
    _onInit(Artboard artboard) {
     this._artboard = artboard;
     _smile = controller.findInput<bool>('smile') as SMIBool;
    }
    
    @override
    Widget build(BuildContext context) {
       ref.listen(signInLogoSmileProvider,
           (previous,  next) {
          // change value
          _smile.value = next;
       });
    
       return RiveAnimation.asset(
             riveFileName,
             artboard: 'board',
             onInit: _onInit,
           );
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多