【问题标题】:Riverpod create StateNotifierProvider with state that extends another classRiverpod 创建具有扩展另一个类的状态的 StateNotifierProvider
【发布时间】:2021-08-14 16:27:36
【问题描述】:

案例:riverpod 新手 - 尝试从常规颤振提供程序迁移。


要在 Riverpod 中创建 StateNotifierProvider,必须为其提供一个扩展 StateNotifier 的实例。

即:

  class SomeModel extends StateNotifier {};
  StateNotifierProvider<SomeModel> someModelProvider = StateNotifierProvider<SomeModel>((ref) => someModel());

一切都很好,如果你有一个简单的模型类。就我而言,我的模型类是分层的并扩展了一个较低的类:

  class SomeModel extends SomeLowerClass ...

我不能扩展 StateNotifier - 我已经在扩展一些低级。我不能对任何一个类都使用“with”,因为它们都有构造函数。

这似乎是一个繁重的限制。有没有办法创建一个提供者,该提供者使用一个模型来扩展除“StateNotifier”之外的另一个类,或者以其他方式而不是通过扩展来使用“StateNotifier”?

(困惑,已经……)

【问题讨论】:

  • 你是怎么走到这一步的?我认为您编写的代码有问题。也许我们可以在没有构造函数的情况下重写低类
  • 在我的例子中,我创建了一个对象而不是扩展 lowerClass。

标签: flutter riverpod


【解决方案1】:

2 个选项:

SomeLowerClass 应该扩展 StateNotifier

class SomeLowerClass extends StateNotifier {
   SomeLowerClass() : super(0); ///or whatever your state should be

   ///some other methods
}

class SomeModel extends SomeLowerClass {}

SomeLowerClass 是一个抽象类供你实现

abstract class SomeLowerClass {
   void myMethod(); 
   ....
}

class SomeModel extends SomeLowerClass implements SomeLowerClass{
   @override
   void myMethod() {}
}

我认为选项 1 是您真正想做的事情

【讨论】:

  • 经过大量编码后,我想我有了答案。我确认后会发布。
【解决方案2】:

好吧,问题当然是我的误解。

@yeasin_shiekh 是正确的,我相信 - 我(最终)得到的是 StateNotifier 包含一个不可变对象(不是扩展 StateNotifier 的对象)。但是,可以构造该不可变对象,但 StateNotifier 会在该对象被替换(未更改)时发送通知。

在我的例子中,我的模型是一个大的、可变的对象。所以 StateNotifier 不是正确使用的东西。 “ChangeNotifier”是我需要的(也是我与颤振提供者一起使用的)。然后模型“扩展”ChangeNotifier(或者如果模型扩展了其他内容,您可以使用“with” - 我的情况)并且您像以前一样在更改时显式调用“notifyListeners()”。

更清楚地了解区别...

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 2021-12-28
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多