我有 MyApp 类,负责加载应用程序。我在MyApp中加载了一个Class HomeWidget 作为主页。
void main() => runApp(new myApp());
class myApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'My App',
color: Colors.grey,
home: new HomeWidget(),
theme: new ThemeData(
primarySwatch: Colors.lightBlue,
),
routes: <String, WidgetBuilder>{
"/ItemDetailWidget": (BuildContext context) => new MovieDetailsPage(),
},
);}}
HomeWidget包含 - Header,ListView,BottomNavigation。
当用户点击ListView中的特定项目时,我想显示新的窗口小部件/页面( ItemDetailWidget ),其中包含有关该特定项目的所有信息。
所以我创建了 ItemDetailWidget ,它是有状态的,它接受一个类型为Object MyModel 的参数。我为了目的使它成为有条不紊的。
我应该如何在传递时将ItemDetailWidget添加到路线中 参数呢?
我尝试使用
"/ItemDetailWidget": (BuildContext context) => new ItemDetailWidget(),
然而,它抛出错误&#34; 构造函数返回类型动态,不是预期类型小部件&#34;
&安培;另外,我如何使用Navigator语法将MyModel对象传递给ItemDetailWidget?我在ListView中有onTap()函数。
Navigator.of(上下文).pushNamed(&#39; / WIDGET1&#39);
答案 0 :(得分:1)
这取决于您发送的数据;听起来在你的情况下你在数据库(或其他东西)中有一堆电影细节,并且你希望能够显示该电影的细节。你可以做的是为每部电影使用一个唯一的标识符,并将其放在请求中;在评论中提到的potential duplicate中或多或少地描述了这一点。颤动stocks example也解释了这一点。
总结:
推送时,请执行pushNamed("moviedetails/${movieUniqueIdentifier}")
。
在MaterialApp中,您可以设置
路线:
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => new Movie(movies, _configuration),
'/settings': (BuildContext context) => new MovieSettings(_configuration)
},
和
onGenerateRoute: (routeSettings) {
if (routeSettings.name.startsWith("movie:") {
// parse out movie, get data, etc
}
}
然而,这并不总是最简单的做事方式 - 例如,您的数据库需要一段时间才能响应,因此您希望先进行查询然后传入结果(缓存会很好)回答这个问题,但现在让我们忽略它= D)。我仍然推荐第一种方法,但有些情况下它不起作用。
要直接传递对象(如问题实际要求),您可以使用:
Navigator.of(context).push(new PageRouteBuilder(pageBuilder:
(context, animation, secondaryAnimation) {
// directly construct the your widget here with whatever object you want
// to pass in.
})
请注意,如果您的代码中包含这些Navigator.of(context).push
块,则会非常混乱;我通过使用静态便捷方法来避免这种情况,例如MyNavigator.pushMovie(context, movieObject)
,它会在引擎盖下调用Navigator.of(context)....
。 (我也是Navigator的子类,所以做MyNavigator.of(上下文),但我的设置很复杂,因为它会做一些额外的自定义导航内容。)