【问题标题】:What is the difference between generics and dynamic in dart?飞镖中的泛型和动态有什么区别?
【发布时间】:2019-09-30 01:03:46
【问题描述】:

让我介绍一下为什么会出现这个问题。 (Detail here)

type '(String, String) => bool' is not a subtype of type '(dynamic, String) => bool'

这是来自material_search 的错误,solution 是:

   - _filter(T v, String c) {
   + _filter(dynamic v, String c) {
   - onSelect: (T value) => Navigator.of(context).pop(value),
   + OnSelect: (dynamic value) => Navigator.of(context).pop(value),

将所有泛型类型T 更改为动态,并且问题似乎发生在 dart 2 出现时。

所以,我在这里得到了这些问题,

  1. 飞镖中的泛型动态有什么区别?
  2. 仅适用于泛型或另一方面的限制是什么?在上述问题中,这仅适用于动态

编辑: 让我举一个简单的例子让问题更清楚:

用遗传定义一个类

typedef bool GeneticFunction<T>(T geneticData, String key);

class Component<T> extends StatefulWidget {
  Component({this.geneticFunc});
  final GeneticFunction<T> geneticFunc;

  @override
  _componentState<T> createState() => _componentState<T>();
}

一种方法在下面起作用

#1
    Component<CoolType>(
      geneticFunc: (CoolType cool, String keyword){
        return false;
      },
    );
#2
    Component<CoolType>(
      geneticFunc: (dynamic cool, String keyword){
        return false;
      },
    );

答案 #2 有效,这意味着我甚至不需要通用,只需 动态。如果你使用#1,有时运行时甚至没有错误,你可能会卡在那里一整天。

有一个官方讨论here,说T在运行时总是dynamic,所以#2是唯一的选择.

最后,我不知道什么时候使用generic,现在似乎总是使用dynamic,因为上面的结果。

【问题讨论】:

  • 您能否提供导致此错误的调​​用:type '(String, String) =&gt; bool' is not a subtype of type '(dynamic, String) =&gt; bool'?我看到了修复,但是要看到对 _filter 的调用,我必须在这里重新创建错误:github.com/ianldgs/material_search/issues/11
  • @GazihanAlankus,我认为我最新的示例代码是相同的想法,因为我在那里简化了我的 filter 函数:P
  • @GazihanAlankus,在_componentState 中,覆盖一个简单的initState,并调用print("the test one"); var a = widget.geneticFunc; print("the test two");。您可以在测试二和测试一之间找到错误。
  • #1 和 #2 在 DartPad 中似乎都对我有用(在去除颤动的东西之后)。 dartpad.dartlang.org/8e054e39063362a360f1b376ab4d6f95 如果您可以创建错误代码,我很乐意提供帮助。使用泛型的原因是具有类型安全性。你可以做任何动态的事情,但你并不比 JavaScript 更好。
  • 你应该在这里看到MaterialSearchResult 的类型参数是什么:github.com/ianldgs/material_search/blob/… 你可以在那里设置一个断点来做到这一点。 MaterialSearchResult&lt;T&gt; 得到的 T 可能与 MaterialSearch&lt;T&gt; 的 T 不兼容。

标签: dart flutter


【解决方案1】:

抱歉我的问题拖了这么久,这个问题的真正问题是将泛型与 StatefulWidget 一起使用的正确方法是什么?

让我们看看原始代码:

class Component<T> extends StatefulWidget {
  Component({this.data, this.geneticFunc});
  final T data;
  final GeneticFunction<T> geneticFunc;
  void test()
  {
    var testFunc = geneticFunc;
    testFunc(data, "123");
  }

  @override
  _ComponentState<T> createState() {
    return _ComponentState<T>();
  }
}

class _ComponentState<T> extends State<Component>
{
  @override
  void initState() {
    print("test one");
    var a = widget.geneticFunc;
    print("test two");
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Container(width: 20, height: 20,);
  }
}

你猜怎么着?只要记住在扩展泛型类时添加&lt;T&gt;,问题就解决了。

class _ComponentState<T> extends State<Component<T>>

所以type '(String, String) =&gt; bool' is not a subtype of type '(dynamic, String) =&gt; bool' 的问题再也不会困扰我了。

下面的代码现在应该可以工作了。

Component<CoolType>(
  geneticFunc: (CoolType a, String key){
    return false;
  },
)

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 2022-11-16
    • 2019-06-13
    • 2023-01-10
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多