Для навигации я создал простой фабричный класс, который генерирует ListTile, который проталкивает маршрут к навигатору:
static Widget simpleNavRow(String text, BuildContext context, String route) {
return Column(
children: <Widget>[
ListTile(
title: Text(text),
onTap: () {
Navigator.pushNamed(context, route);
},
),
Divider(),
],
);
}
Однако вскоре я понял, что было бы удобно также поддерживать push-виджеты (или создать экземпляр из своего класса, если это возможно).Я не мог понять, как заставить аргумент «route» принимать либо String, либо Widget, поэтому я создал класс, который инициализируется одним из этих двух типов.Этот код работает, но есть ли лучший способ добиться этого?
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()))