这个问题在这里已有答案:
我有 MyApp 类负责加载应用程序 . 我正在MyApp中加载一个类 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(),
但是,它将错误抛出为“ The Constructor return type dynamic that isn't of expected type widget ”
以及如何使用Navigator语法将MyModel对象传递给ItemDetailWidget?我在ListView中有onTap()函数 .
Navigator.of(上下文).pushNamed( '/ WIDGET1');
1 回答
这取决于您发送的数据;听起来在你的情况下,你在数据库(或其他东西)中有一堆电影细节,并且你希望能够显示该电影的细节 . 你可以做的是为每部电影使用一个唯一的标识符,并将其放在请求中;在评论中提到的_1838728中或多或少地描述了这一点 . 颤振stocks example也解释了这一点 .
总结一下:
推动时,请执行
pushNamed("moviedetails/${movieUniqueIdentifier}")
.在MaterialApp中,您可以进行设置
路线:
和:
然而,这并不总是最简单的处理方式 - 例如你的数据库需要一段时间来响应,所以你想先做一个查询然后传入结果(缓存对这个很好的答案但是让我们现在忽略它= D) . 我仍然推荐第一种方法,但有些情况下它不起作用 .
要改为直接传递对象(正如问题实际上要求),您可以使用:
请注意,如果您的代码中包含这些
Navigator.of(context).push
块,则会非常混乱;我通过使用静态便捷方法来避免这种情况,例如MyNavigator.pushMovie(context, movieObject)
,它会在引擎盖下调用Navigator.of(context)....
. (我也是Navigator的子类,所以做MyNavigator.of(上下文),但我的设置很复杂,因为它做了一堆额外的自定义导航的东西) .