2

这是我作为要点的代码我在 dartpad.dev 中的代码的交互式版本

关于我试图用这个应用程序做的事情的简要说明:

我有两个页面/,我想在 TextField 中键入一个字符串,它将同时开始出现在 中appBar,还有另一个按钮,当你按下它时,它将带你到另一个页面(Home小部件),但是text你写的那个/页面。我希望这个过渡就像一个英雄动画,其中从appBar页面/fliesbody文本Info

我以前使用

Navigator.pushNamed(context, "Info", arguments: {"text": myController.text});

路由 到 新 页面 并 传递 我 想 在那里 显示 的 文本 . 我 能够 做到 , 但 即使 在 配置 模式 , 动画 也 太快一个我觉得太快的动画的gif

但是我从这个问题得到的答案是使用

Navigator.push(
  context,
  PageRouteBuilder(
      transitionDuration: Duration(seconds: 2),
      pageBuilder: (_, __, ___) => Page2())
      ),

但问题是,Navigator.push(context, PageRouteBuilder( ... ) )不允许你传递参数,我绝对希望能够做到这一点。

4

1 回答 1

1

如果您可以使用PageRouteBuilder 类控制过渡动画,那么您唯一关心的就是传递数据。现在,我敢肯定,你错过了这个,这是:

将数据作为参数传递给 Flutter 中的类。你不必总是喜欢这样的东西arguments: {}

现在,我的意思是,Flutter 中的每个类都可以接受数据作为参数,你是怎么做到的。

  • 创建一个接受参数的内容[你已经完成了]
  • 在使用时传递类中的数据,在我们的例子中Info(pass_it_here)[现在必须完成]

我们如何在代码中实现这一点?

因此,您只需在转换时传递如下所述的数据。您的 Info 类正在接受数据。所以你需要做的就是实现你想要的,这是:

Navigator.push(
  context,
  PageRouteBuilder(
      transitionDuration: Duration(seconds: 2),
      pageBuilder: (_, __, ___) => Info(text: myController.text) // <-- here is the magic
  )
)

建议:

如果你为一个类定义参数,让我们以Info唯一的例子为例,请声明它为final。我知道您将更改数据,但您可以将内容复制到局部变量并做任何您想做的事情。

例子

class Info extends StatefulWidget {
  final String text;  // <-- Declare this as final
  
  Info({this.text});

  @override
  _InfoState createState() => _InfoState();
}

在主类中使用 @immutable 数据:

class _InfoState extends State<Info> {
   // here how you are just copying the data to the local variable
   // var _myText = widget.text;
   String _myText = "";

   // or you can do this via @initState
   @override
   void initState(){
     super.initState();

     _myText = widget.text;
   }

   // Now use your variable _myText however you want
}
于 2020-11-07T10:57:28.803 回答