所以我一直在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
实际上将作为参数传递?
答案 0 :(得分:3)
typedef可用于指定我们想要的函数签名 要匹配的特定功能。函数签名由a定义 函数的参数(包括它们的类型)。返回类型不是 功能签名的一部分。其语法如下。
在您的情况下,PageRouteBuilder作为参数:
两个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()
是一个小部件。