onGenerateRoute
속성을 사용하여 위젯 앱의 경로를 생성 할 수 있습니다. 도움이
import 'package:flutter/widgets.dart';
void main() => runApp(new MyWidgetsApp());
class MyWidgetsApp extends StatelessWidget {
Route generate(RouteSettings settings){
Route page;
switch(settings.name){
case "/":
page = new PageRouteBuilder(
pageBuilder: (BuildContext context,Animation<double> animation,
Animation<double> secondaryAnimation){
return new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text("Home Page",textDirection: TextDirection.ltr,),
const Padding(padding: const EdgeInsets.all(10.0)),
new GestureDetector(
onTap:() => Navigator.of(context).pushNamed("/first"),
child: new Container(
padding: const EdgeInsets.all(10.0),
color:Colors.blue,
child: const Text("Go to First Page"),
),
),
const Padding(padding: const EdgeInsets.all(10.0)),
new GestureDetector(
onTap:() => Navigator.of(context).pushNamed("/abcd"),
child: new Container(
padding: const EdgeInsets.all(10.0),
color:Colors.blue,
child: const Text("Unkown Route"),
),
)
],
);
},
transitionsBuilder: (_, Animation<double> animation, Animation<double> second, Widget child) {
return new FadeTransition(
opacity: animation,
child: new FadeTransition(
opacity: new Tween<double>(begin: 1.0, end: 0.0).animate(second),
child: child,
),
);
}
);
break;
case "/first":
page = new PageRouteBuilder(
pageBuilder: (BuildContext context,Animation<double> animation,
Animation<double> secondaryAnimation){
return new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text("First Page",textDirection: TextDirection.ltr,),
const Padding(padding: const EdgeInsets.all(10.0)),
new GestureDetector(
onTap:() => Navigator.of(context).pop(),
child: new Container(
padding: const EdgeInsets.all(10.0),
color:Colors.blue,
child: const Text("Back"),
),
)
]
);
},
transitionsBuilder: (_, Animation<double> animation, Animation<double> second, Widget child) {
return new FadeTransition(
opacity: animation,
child: new FadeTransition(
opacity: new Tween<double>(begin: 1.0, end: 0.0).animate(second),
child: child,
),
);
}
);
break;
}
return page;
}
Route unKnownRoute(RouteSettings settings){
return new PageRouteBuilder(
pageBuilder: (BuildContext context,Animation<double> animation,
Animation<double> secondaryAnimation){
return new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text("First Page",textDirection: TextDirection.ltr,),
const Padding(padding: const EdgeInsets.all(10.0)),
new GestureDetector(
onTap:() => Navigator.of(context).pop(),
child: new Container(
padding: const EdgeInsets.all(10.0),
color:Colors.blue,
child: const Text("Back"),
),
)
]
);
}
);
}
@override
Widget build(BuildContext context) {
return new WidgetsApp(
onGenerateRoute: generate,
onUnknownRoute: unKnownRoute,
textStyle: const TextStyle(),
initialRoute: "/",
color: Colors.red
);
}
}
희망 :
여기에 같은 아주 최소한의 구현입니다!
아, 와우, MaterialApp의 배치와 비교하면 많은 부분이 있습니다. 예를 들어 주셔서 감사 드리며, 계속하겠습니다. 한편,이 라이브러리에서 좋은 대안을 발견했습니다. https://github.com/goposse/fluro – Ilja
버전이 성공적으로 구현되었지만 대체 될 때 라우트 애니메이션을 만드는 방법을 알아내는 데 문제가 있습니다. 나는 Navigator api docs를 따라 갔다. 스핀과 페이드 전환은 작동한다. (https://docs.flutter.io/flutter/widgets/Navigator-class.html) 이제는 새로운 경로가 움직이는 동안 이전 경로가 움직이고있다. 새 항목이 완료 될 때까지 표시됩니다. 이상적으로는, 먼저 오래된 경로를 퇴색시키고, 새로운 경로로 사라지도록하고 싶습니다. – Ilja
전환 빌더는 시도하려는 것을 달성하는 데 사용할 수있는'secondaryAnimation' 인수를 제공합니다. [Here] (https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/routes.dart#L665)는 구현 방법입니다. –