[英]Is there any way that a function can accept either of two similar types as an argument?
[英]Is there a way to have an argument with two types in Dart?
对于导航,我构建了一个简单的工厂类,它生成一个将路由推送到导航器的 ListTile:
static Widget simpleNavRow(String text, BuildContext context, String route) {
return Column(
children: <Widget>[
ListTile(
title: Text(text),
onTap: () {
Navigator.pushNamed(context, route);
},
),
Divider(),
],
);
}
然而,我很快意识到支持推送小部件也会很方便(或者如果可能的话从它们的类中实例化)。 我不知道如何让“路由”参数接受字符串或小部件,所以我创建了一个用这两种类型之一初始化的类。 这段代码有效,但有没有更好的方法来实现这一点?
class NavTo {
String route;
Widget widget;
NavTo.route(this.route);
NavTo.widget(this.widget);
push(BuildContext context) {
if (route != null) {
Navigator.pushNamed(context, route);
}
if (widget != null) {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return widget;
}));
}
}
}
class ListHelper {
static final padding = EdgeInsets.all(12.0);
static Widget simpleNavRow(String text, BuildContext context, NavTo navTo) {
return Column(
children: <Widget>[
ListTile(
title: Text(text),
onTap: () {
navTo.push(context);
},
),
Divider(),
],
);
}
}
// usage:
// ListHelper.simpleNavRow('MyWidget', context, NavTo.widget(MyWidget()))
由于您期望多种类型之一,那么dynamic
然后在 NavTo 的 push 方法中,您可以检查类型:
class NavTo {
dynamic route;
push(BuildContext context) {
if (route is String) {
...
} else if (route is Widget) {
...
}
}
}
我不相信 Dart 中提供联合类型。 我喜欢你的解决方案而不是使用动态,因为它是强类型的。 您可以使用命名参数。
NavTo({this.route,this.widget})
但是,您没有对一个且只有一个参数进行编译类型检查。
我对您的构造函数所做的唯一改进是添加@required
。
我个人喜欢给 Items 一个 MaterialPageRoute 参数
static Widget simpleNavRow(String text, BuildContext context, MaterialPageRoute route) {
return Column(
children: <Widget>[
ListTile(
title: Text(text),
onTap: () {
Navigator.push(context, route);
},
),
Divider(),
],);
}
项目像这样保持愚蠢,我决定它们在父级中做什么。 在您可以为每种类型创建一个项目工厂之后,您可以像这样初始化正确的路线:
class ItemExemple extends StatelessWidget {
final String text;
final MaterialPageRoute route;
ItemExemple(this.text, this.route);
factory ItemExemple.typeA(String text, BuildContext context) =>
new ItemExemple(text, new MaterialPageRoute(builder: (context) => new ItemA()));
factory ItemExemple.typeB(String text, BuildContext context) =>
new ItemExemple(text, new MaterialPageRoute(builder: (context) => new ItemB()));
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
ListTile(
title: Text(this.text),
onTap: () {
Navigator.push(context, route);
},
),
Divider(),
],);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.