普通和动态Dart有什么区别?

时间:2019-05-13 05:14:26

标签: dart flutter

让我介绍为什么出现此问题的错误。 (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类型的泛型更改为动态,并且问题似乎在出现飞镖2时发生。

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

  1. dart中的泛型动态有什么区别?
  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 在运行时总是动态的,因此#2 是只能选择。

最后,由于上述结果,我不知道何时使用泛型,并且现在看来总是使用动态

1 个答案:

答案 0 :(得分:2)

很抱歉,我的问题长时间拖延,此问题的真正问题是在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,);
  }
}

猜猜是什么?只需记住在扩展泛型类时添加一个<T>,就会引起问题。

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

因此问题type '(String, String) => bool' is not a subtype of type '(dynamic, String) => bool'再也不会困扰我。

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

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