【问题标题】:Flutter dynamic type argumentFlutter 动态类型参数
【发布时间】:2019-11-07 10:58:19
【问题描述】:

我正在尝试将动态类型参数传递给Provider.of<T>(context)

我的代码

class CustomInputField extends StatelessWidget {
  final Type stateClass;

  CustomInputField({
    Key key,
    this.stateClass,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var state = Provider.of<stateClass>(context);

    return TextFormField(
      key: state.key,
      ...
    );
  }
}

但这给了我以下错误:

名称“stateClass”不是类型,因此不能用作类型参数。 尝试将名称更正为现有类型,或定义名为“stateClass”的类型。

有人知道如何正确执行此操作吗?

这可能不是一个好的做法,或者甚至是不可能的。但问题是,我想为我的应用程序中的所有输入字段制作一个 CustomInputField 小部件。我正在使用 Provider 包中的 ChangeNotifierProvider 类,并希望将不同的状态传递给这个 CustomInputField 小部件

【问题讨论】:

    标签: flutter generic-type-argument


    【解决方案1】:

    你不能在 Dart 中动态地将类型传递给泛型。唯一的方法是使用 switch/if-else 块并在泛型中返回具有不同类型的对象。

    【讨论】:

    • 所以我先做了一个枚举类,叫StateClassEnum。然后我对该枚举进行了扩展,其中包含一个名为getProvider(BuildContext context) 的开关方法,其返回类型为dynamic。 switch-method 为每个 StateClassEnum-case 返回 Provider.of。在我的小部件的构建方法中,我调用var state = stateEnum.getProvider(context);。我唯一不确定的是 dynamic 返回类型。使用dynamic是否正确?
    • @SimonartM 如果你的 bloc 类继承自同一个类,你可以设置这个类的返回类型。但是,我认为它不会有足够的帮助或易于使用。我不知道它对您的体系结构有多好,但也许可以尝试使用一个通用的 bloc 类,它会根据枚举值或类似的东西而有所不同。 Dart 不允许使用泛型做很多事情。
    • 啊当然,我应该先从超类继承我的 blocClasses。这是一个很好的观点。此外,尝试创建一个 bloc 类将非常困难,我想我只会编写比删除更多的代码。我必须对如何构建它有一个很好的想法,我正在尝试/思考接口和 mixin 的不同事物,当我完成这个时,我会发布一个更新评论。无论如何感谢您的支持。
    • 小更新,我使用了枚举类以及从超类扩展我的状态。我的超级班级几乎拥有所有东西,而我在各个州级班级中的细微差别。所以现在我的 ProviderBuilder 接受 buildcontext 和枚举可以返回一个固定类的提供者而不是动态的。也许有更好的解决方案,但现在这可行。谢谢你的建议。
    猜你喜欢
    • 2021-09-21
    • 2021-03-13
    • 2021-07-05
    • 2015-09-30
    • 1970-01-01
    • 2011-02-28
    • 2021-01-15
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多