Comment envoyer la chaîne verte de la page HomePage à la page ContaPage?
Je pense que c'est tellement Navigator.of(context).pushNamed('/conta/green');
mais je ne sais pas comment accéder à la page conta
la chaîne green
Ainsi, en obtenant la valeur de la chaîne, je peux par exemple changer la couleur du backgroundColor de appBar
dans ContaPage
.
main.Dart
import "package:flutter/material.Dart";
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "MyApp",
home: new HomePage(),
routes: <String, WidgetBuilder> {
'/home': (BuildContext context) => new HomePage(),
'/conta': (BuildContext context) => new ContaPage()
},
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
backgroundColor: new Color(0xFF26C6DA),
),
body: new ListView (
children: <Widget>[
new FlatButton(
child: new Text("ok"),
textColor: new Color(0xFF66BB6A),
onPressed: () {
Navigator.of(context).pushNamed('/conta');
},
),
],
)
);
}
class ContaPage extends StatelessWidget {
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
backgroundColor: new Color(0xFF26C6DA),
),
);
}
Vous pouvez créer un MaterialPageRoute
à la demande et passer l'argument au constructeur ContaPage
.
import "package:flutter/material.Dart";
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "MyApp",
home: new HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
backgroundColor: new Color(0xFF26C6DA),
),
body: new ListView (
children: <Widget>[
new FlatButton(
child: new Text("ok"),
textColor: new Color(0xFF66BB6A),
onPressed: () {
Navigator.Push(context, new MaterialPageRoute(
builder: (BuildContext context) => new ContaPage(new Color(0xFF66BB6A)),
));
},
),
],
)
);
}
class ContaPage extends StatelessWidget {
ContaPage(this.color);
final Color color;
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
backgroundColor: color,
),
);
}
Vous pouvez toujours créer une variable statique String avec du vert comme valeur dans votre HomePage et utiliser cette valeur dans vos itinéraires lorsque vous créez un nouveau ContaPage. Quelque chose comme ça:
import "package:flutter/material.Dart";
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "MyApp",
home: new HomePage(),
routes: <String, WidgetBuilder> {
'/home': (BuildContext context) => new HomePage(),
'/conta': (BuildContext context) => new ContaPage(HomePage.color)
},
);
}
}
class HomePage extends StatelessWidget {
static String color = "green";
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
backgroundColor: new Color(0xFF26C6DA),
),
body: new ListView (
children: <Widget>[
new FlatButton(
child: new Text("ok"),
textColor: new Color(0xFF66BB6A),
onPressed: () {
Navigator.of(context).pushNamed('/conta');
},
),
],
)
);
}
class ContaPage extends StatelessWidget {
ContaPage({this.color})
String color;
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
backgroundColor: new Color(0xFF26C6DA),
),
);
}
Il y a probablement de meilleures solutions mais cela m'est d'abord venu à l'esprit :)
Une meilleure solution est déjà donnée sur le site Web de Flutter, comment utiliser:
Arguments
class ScreenArguments {
final String title;
final String message;
ScreenArguments(this.title, this.message);
}
Extraire les arguments
class ExtractArgumentsScreen extends StatelessWidget {
static const routeName = '/extractArguments';
@override
Widget build(BuildContext context) {
final ScreenArguments args = ModalRoute.of(context).settings.arguments;
return Scaffold(
appBar: AppBar(
title: Text(args.title),
),
body: Center(
child: Text(args.message),
),
);
}
}
Enregistrer l'itinéraire
MaterialApp(
//...
routes: {
ExtractArgumentsScreen.routeName: (context) => ExtractArgumentsScreen(),
//...
},
);
Naviguer
Navigator.pushNamed(
context,
ExtractArgumentsScreen.routeName,
arguments: ScreenArguments(
'Extract Arguments Screen',
'This message is extracted in the build method.',
),
);
Code copié de lien .
Il est un peu tard, mais cela pourrait aider quelqu'un. Je pense que la meilleure façon est d'utiliser le projet de route flutter fluro .
définir certains où globalement:
final router = Router();
définir ensuite les itinéraires
var contaHandler = Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
return ContaPage(color: params["color"][0]);
});
void defineRoutes(Router router) {
router.define("/conta/:color", handler: contaHandler);
}
définissez onGenerateRoute
dans MaterialApp
pour utiliser le générateur de routeur:
new MaterialApp (
...
nGenerateRoute: router.generator
...
),
vous devez ajouter le fluro dans les dépendances:
dependencies:
fluro: "^1.3.4"
et effectuez la mise à niveau du package de la manière suivante ou de la manière IDE.
flutter packages upgrade
Passage des données de la 1ère page à la 2ème
En 1ère page
// sending "Foo" from 1st page
Navigator.Push(context, MaterialPageRoute(builder: (_) => Page2("Foo")));
En 2ème page.
class Page2 extends StatelessWidget {
final String string;
Page2(this.string); // receiving "Foo" in 2nd
}
Retour des données de la 2e page au 1er
En 2ème page
// sending "Bar" from 2nd
Navigator.pop(context, "Bar");
En 1ère page, c'est le même qui a été utilisé précédemment mais avec peu de modifications.
// receiving "Bar" in 1st
String received = await Navigator.Push(context, MaterialPageRoute(builder: (_) => Page2("Foo")));