#flutter #animation #routes #navigation #named-routing
#flutter #Анимация #маршруты #навигация #именованная маршрутизация
Вопрос:
Я хочу использовать анимированный маршрут страницы в моем проекте flutter. Теперь все мои маршруты называются Route, и я не хочу их менять. Могу ли я каким-либо образом использовать анимацию маршрута страницы с именованным маршрутом? Например: если я перехожу PageOne()
к PageTwo()
использованию Navigator.of(context).pushNamed(PageTwo.routename)
, я не хочу видеть переход по умолчанию, может быть, я хочу использовать масштабную анимацию или анимацию затухания. Есть ли какой-нибудь способ сделать это?
onTap: () {
Navigator.of(context).pushNamed(
ProductsSearch.routeName,
arguments: ScreenArguments(null, null, null, null, null, null, true, false),
);
},
Комментарии:
1. на самом деле я не могу использовать
pageTransitionsTheme
cz, который я используюNeumorphicThemeData
, и у него нет вызываемого параметраpageTransitionsTheme
Ответ №1:
В качестве вашего вопроса я решил этот демонстрационный ответ, попробуйте, как только он сработает.
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
home: HomePage(),
onGenerateRoute: (RouteSettings settings) {
final SecondHome args = settings.arguments;
switch (settings.name) {
case '/':
return SlideRightRoute(widget:HomePage());
break;
case '/second':
return
SlideRightRoute(widget:SecondHome(args.data1,args.data2,args.boolvalue));
break;
}
},
),
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: new Center(
child: RaisedButton(
onPressed: () {
Navigator.of(context).pushNamed(
'/second',
arguments:SecondHome("data1","data2",true),
);
},
child: Text('Second Home'),
),
),
);
}
}
class SecondHome extends StatelessWidget {
String data1;
String data2;
bool boolvalue;
SecondHome(this.data1,this.data2,this.boolvalue);
@override
Widget build(BuildContext context) {
print("Secoendhomedata${data1}");
return Scaffold(
appBar: AppBar(
title: Text('Second Home'),
),
body: new Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go Back'),
),
),
);
}
}
class SlideRightRoute extends PageRouteBuilder {
final Widget widget;
SlideRightRoute({this.widget})
: super(
pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return widget;
},
transitionsBuilder: (BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
return new SlideTransition(
position: new Tween<Offset>(
begin: const Offset(1.0, 0.0),
end: Offset.zero,
).animate(animation),
child: child,
);
},
);
}
Комментарии:
1. Я хотел знать, как использовать с pushNamed, не ставя под угрозу мои аргументы
2. Вам нужно использовать onGenerateRoute в вашем виджете MaterialApp.
3. Если я использую onGenerateRoute, я не могу использовать аргументы. I должен быть передан в качестве параметра. У меня есть какой-нибудь способ?
4. Я отредактировал свой ответ, надеюсь, ваша проблема решена, если она работает, отметьте галочкой ответ.