【问题标题】:How to pass object to StatefulWidget while Routing in Flutter? [duplicate]在 Flutter 中路由时如何将对象传递给 StatefulWidget? [复制]
【发布时间】:2018-08-29 15:16:50
【问题描述】:

我有 MyApp 类负责加载应用程序。我正在加载一个类 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 ,它是有状态的,并且它接受一个对象类型的参数 MyModel 假设。我故意让它有状态。

当我经过时,我应该如何将 ItemDetailWidget 添加到 Routes 中 参数呢?

我尝试过使用

        "/ItemDetailWidget": (BuildContext context) => new ItemDetailWidget(),

但是,它抛出错误为“构造函数返回类型动态不是预期类型的​​小部件

& 另外,我如何使用 Navigator 语法将 MyModel 对象传递给 ItemDetailWidget?我在 ListView 中有 onTap() 函数。

Navigator.of(context).pushNamed('/widget1');

【问题讨论】:

    标签: flutter


    【解决方案1】:

    这取决于您发送的数据;听起来在您的情况下,您在数据库(或其他东西)中有一堆电影详细信息,并且您希望能够显示该电影的详细信息。您可以做的是为每部电影使用唯一标识符,并将其放入请求中; cmets 中提到的potential duplicate 或多或少地描述了这一点。颤振stocks example 也解释了这一点。

    总结一下:

    1. 当你推送时,做一个pushNamed("moviedetails/${movieUniqueIdentifier}")

    2. 在你的 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) 也是如此,但我的设置很复杂,因为它做了一堆额外的自定义导航内容)。

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 2019-12-15
      • 2022-12-17
      • 2016-08-27
      • 2023-04-06
      • 2019-08-25
      • 1970-01-01
      • 2022-09-24
      • 2018-12-24
      相关资源
      最近更新 更多