如何在 Flutter 中路由时将对象传递给 StatefulWidget?
How to pass object to StatefulWidget while Routing in Flutter?
我有 MyApp class 负责加载应用程序。我正在加载 Class HomeWidget 作为 MyApp 中的主页。
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 中的特定项目时,我想显示新的 Widget/Page(ItemDetailWidget),其中包含关于该特定项目的所有信息。
所以我创建了 ItemDetailWidget,它是有状态的,它接受一个类型为 Object MyModel 的参数。我出于目的使它有状态。
How should i add ItemDetailWidget into Routes as i'm passing
parameter to it?
我尝试使用
"/ItemDetailWidget": (BuildContext context) => new ItemDetailWidget(),
但是,它抛出错误为“构造函数 return 类型动态不是预期类型的小部件 ”
& 另外,如何使用 Navigator 语法将 MyModel 对象传递给 ItemDetailWidget?我在 ListView 中有 onTap() 函数。
Navigator.of(上下文).pushNamed('/widget1');
这取决于您发送的数据;在您的情况下,听起来您在数据库(或其他东西)中有一堆电影细节,并且您希望能够显示该电影的细节。您可以做的是为每部电影使用一个唯一标识符,并将其放入请求中;这在potential duplicate mentioned in the comments. The flutter 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(context) 相反,但我的设置很复杂,因为它做了一堆额外的自定义导航内容)。
我有 MyApp class 负责加载应用程序。我正在加载 Class HomeWidget 作为 MyApp 中的主页。
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 中的特定项目时,我想显示新的 Widget/Page(ItemDetailWidget),其中包含关于该特定项目的所有信息。
所以我创建了 ItemDetailWidget,它是有状态的,它接受一个类型为 Object MyModel 的参数。我出于目的使它有状态。
How should i add ItemDetailWidget into Routes as i'm passing parameter to it?
我尝试使用
"/ItemDetailWidget": (BuildContext context) => new ItemDetailWidget(),
但是,它抛出错误为“构造函数 return 类型动态不是预期类型的小部件 ”
& 另外,如何使用 Navigator 语法将 MyModel 对象传递给 ItemDetailWidget?我在 ListView 中有 onTap() 函数。
Navigator.of(上下文).pushNamed('/widget1');
这取决于您发送的数据;在您的情况下,听起来您在数据库(或其他东西)中有一堆电影细节,并且您希望能够显示该电影的细节。您可以做的是为每部电影使用一个唯一标识符,并将其放入请求中;这在potential duplicate mentioned in the comments. The flutter 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(context) 相反,但我的设置很复杂,因为它做了一堆额外的自定义导航内容)。