Dart

时间:2018-02-19 20:47:06

标签: dart flutter

所以我一直在Dart中使用typedef一段时间而不考虑它们实际上是什么。例如,在这段代码中:

new PageRouteBuilder(
  pageBuilder: (BuildContext context, Animation<double> animation1, Animation<double> animation2) => new Test(),
  transitionsBuilder: (BuildContext context, Animation<double> animation1, Animation<double> animation2, Widget child) {
    return new FadeTransition(
      child: child,
      opacity: animation1,
    );
  }
)

pageBuilder属性需要一个名为RoutePageBuilder的typedef,而transitionsBuilder属性需要一个名为RouteTransitionsBuilder的typedef。

对我来说,看起来我只是使用了一个带有typedef预定义参数的属性的函数,但我对此不确定。
另外,这里的输入实际上是什么参数?因为我例如使用Animation<double> animation1作为参数,但实际上并没有创建新的Animation,或者它是什么?如果没有,那么Animation实际上将作为参数传递?

2 个答案:

答案 0 :(得分:3)

  

typedef可用于指定我们想要的函数签名   要匹配的特定功能。函数签名由a定义   函数的参数(包括它们的类型)。返回类型不是   功能签名的一部分。其语法如下。

在您的情况下,PageRouteBuilder作为参数:

  • pageBuilder RoutePageBuilder typedef - 只是一个与RoutePageBuilder typedef签名匹配的函数。
  • transitionsBuilder RouteTransitionsBuilder typedef - 与pageBuilder完全相同,但匹配RouteTransitionsBuilder签名。

两个typedef(RouteTransitionsBuilder和RoutePageBuilder)类似于单个方法的接口(OO编程)。在这种情况下,typedef RoutePageBuilder强制您作为参数传递一个函数,该函数返回一个Widget,它将上下文和两个Animation作为参数。

如果您想了解有关该功能中传递的参数的更多详细信息,可以在flutter的文档中进行检查,例如:

  

动画→动画驱动路线的动画   过渡和前一路线的前向过渡。   只读,继承

  

secondaryAnimation→动画路线的动画   被推到这条路线之上。这个动画让这条路线   与推进的路线的入口和出口过渡协调   这条路线的顶部。   只读,继承

PS:如果您浏览flutter代码并到达routes.dart文件,您可以找到记录此部分的注释:

/// Override this method to build the primary content of this route.
  ///
  /// The arguments have the following meanings:
  ///
  ///  * `context`: The context in which the route is being built.
  ///  * [animation]: The animation for this route's transition. When entering,
  ///    the animation runs forward from 0.0 to 1.0. When exiting, this animation
  ///    runs backwards from 1.0 to 0.0.
  ///  * [secondaryAnimation]: The animation for the route being pushed on top of
  ///    this route. This animation lets this route coordinate with the entrance
  ///    and exit transition of routes pushed on top of this route.
  ///
  /// This method is called when the route is first built, and rarely
  /// thereafter. In particular, it is not called again when the route's state
  /// changes. For a builder that is called every time the route's state
  /// changes, consider [buildTransitions]. For widgets that change their
  /// behavior when the route's state changes, consider [ModalRoute.of] to
  /// obtain a reference to the route; this will cause the widget to be rebuilt
  /// each time the route changes state.
  ///
  /// In general, [buildPage] should be used to build the page contents, and
  /// [buildTransitions] for the widgets that change as the page is brought in
  /// and out of view. Avoid using [buildTransitions] for content that never
  /// changes; building such content once from [buildPage] is more efficient.
  Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation);

答案 1 :(得分:0)

来自docs

  

在Dart中,函数是对象,就像字符串和数字是对象一样。 typedef或函数类型别名(也称为)为函数类型提供了一个名称,您可以在声明字段和返回类型时使用该名称。将函数类型分配给变量时,typedef会保留类型信息。

如果您检查RoutePageBuilder的实现,则为示例:

typedef RoutePageBuilder = Widget Function(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation); 

这意味着RoutePageBuilder也称为Function,它返回一个Widget

然后,如果您检查PageRouteBuilder的源代码,则会发现实例变量pageBuilder的类型为RoutePageBuilder,因此在创建PageRouteBuilder的新实例时您可以执行以下操作:

new PageRouteBuilder(
  pageBuilder: (BuildContext context, Animation<double> animation1, Animation<double> animation2) => new Test(),

new Test()是一个小部件。