Как изменить продолжительность анимации героя во Flutter, но с аргументами
Вот мой код как суть ( интерактивная версия моего кода в dartpad.dev)
Краткое изложение того, что я пытался сделать с этим приложением:
У меня две страницы
/
Где я хочу ввести строку в TextField, которая одновременно начнет появляться вappBar
, и есть еще одна кнопка, при нажатии на которую вы переходите на другую страницу (Home
Виджет), но сtext
что вы написали в/
страница. Я хочу, чтобы этот переход был похож на анимацию героя, где текст изappBar
из/
страницаflies
вbody
изInfo
Я ранее использовал
Navigator.pushNamed(context, "Info", arguments: {"text": myController.text});
Чтобы перейти на новую страницу, а также передать текст, который я хочу отобразить там. И я смог это сделать, но даже в режиме профиля анимация слишком быстрая
Но ответ, который я получил от этого вопроса, заключался в том, чтобы использовать
Navigator.push(
context,
PageRouteBuilder(
transitionDuration: Duration(seconds: 2),
pageBuilder: (_, __, ___) => Page2())
),
Но проблема в том, что
Navigator.push(context, PageRouteBuilder( ... ) )
не позволяет передавать аргументы, что я определенно хочу иметь возможность.
1 ответ
Если вы можете управлять анимацией перехода с помощью класса PageRouteBuilder, то единственное, что вас волнует, - это передача данных. Я уверен, что вы упустили это, а это:
Передача данных в качестве аргумента для классов во Flutter. Вам не обязательно всегда предпочитать что-то подобное
arguments: {}
.
Теперь, что я имел в виду, каждый класс во Flutter может принимать данные в качестве аргумента, и как вы это делаете.
- Создайте контент, который принимает аргументы [что вы уже сделали]
- Передавать данные в класс при использовании, в нашем случае
Info(pass_it_here)
[Это нужно сделать сейчас]
Как мы можем добиться этого в коде?
Итак, вам просто нужно передать данные, подобные тем, которые упомянуты ниже, при переходе. Ваш информационный класс нормально принимает данные. Итак, все, что вам нужно сделать, это добиться того, чего вы хотите, это:
Navigator.push(
context,
PageRouteBuilder(
transitionDuration: Duration(seconds: 2),
pageBuilder: (_, __, ___) => Info(text: myController.text) // <-- here is the magic
)
)
Предложение:
Если вы определяете параметр для класса, давайте рассмотрим пример
Info
только, пожалуйста, объявите это окончательным. Я знаю, что вы будете изменять данные, но вы можете скопировать содержимое в локальную переменную и делать с этим все, что захотите.
пример
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
}