Sie können die Eigenschaft onGenerateRoute
verwenden, um eine Route für Widgets-App zu generieren.
Hier ist eine sehr minimale Umsetzung der gleiche:
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
);
}
}
Hoffnung, die geholfen haben!
Oh wow, da ist eine Menge zu vergleichen mit dem Wrapping in MaterialApp. Danke für das Beispiel, ich werde weitermachen und es kaputt machen. In der Zwischenzeit habe ich eine gute Alternative in dieser Bibliothek gefunden: https://github.com/goposse/fluro – Ilja
Ihre Version wurde erfolgreich implementiert, hat aber Probleme herauszufinden, wie man eine Route animieren kann, wenn sie ersetzt wird. Ich folgte Navigator api docs und habe diesen Dreh- und Überblendungs-Übergang funktioniert (https://docs.flutter.io/flutter/widgets/Navigator-class.html) Das Problem, das ich jetzt sehe, ist, dass während neue Route animiert wird, alte ist sichtbar, bis der neue fertig ist. Idealerweise möchte ich zuerst die alte Route ausblenden und dann die neue rotieren. – Ilja
Der Transition Builder stellt das 'secondaryAnimation'-Argument zur Verfügung, mit dem Sie erreichen können, was Sie versuchen. [Hier] (https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/routes.dart#L665) ist, wie Sie es implementieren können. –