繁体   English   中英

有没有办法在 Dart 中有两种类型的争论?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM