Il y a plusieurs choses que vous pouvez faire ici. La réponse de @Mahi, bien que correcte, pourrait être un peu plus succincte et utiliser push plutôt que showDialog comme le demandait le PO. Voici un exemple qui utilise Navigator.push
:
import 'package:flutter/material.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () => Navigator.pop(context),
child: Text('back'),
),
],
),
);
}
}
class FirstPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => new FirstPageState();
}
class FirstPageState extends State<FirstPage> {
Color color = Colors.white;
@override
Widget build(BuildContext context) {
return new Container(
color: color,
child: Column(
children: <Widget>[
RaisedButton(
child: Text("next"),
onPressed: () async {
final value = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondPage()),
),
);
setState(() {
color = color == Colors.white ? Colors.grey : Colors.white;
});
},
),
],
),
);
}
}
void main() => runApp(
MaterialApp(
builder: (context, child) => SafeArea(child: child),
home: FirstPage(),
),
);
Cependant, il existe une autre façon de procéder qui pourrait bien correspondre à votre cas d'utilisation. Si vous utilisez le global
comme quelque chose qui affecte la construction de votre première page, vous pourriez utiliser une InheritedWidget pour définir vos préférences globales d'utilisateur, et chaque fois qu'elles seront modifiées, votre FirstPage sera reconstruite. Cela fonctionne même dans un widget sans état, comme illustré ci-dessous (mais devrait également fonctionner dans un widget avec état).
Un exemple de inheritedWidget dans flutter est le thème de l'application, bien qu'ils le définissent dans un widget au lieu de le construire directement comme je l'ai fait ici.
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {
ColorDefinition.of(context).toggleColor();
Navigator.pop(context);
},
child: new Text("back"),
),
],
),
);
}
}
class ColorDefinition extends InheritedWidget {
ColorDefinition({
Key key,
@required Widget child,
}): super(key: key, child: child);
Color color = Colors.white;
static ColorDefinition of(BuildContext context) {
return context.inheritFromWidgetOfExactType(ColorDefinition);
}
void toggleColor() {
color = color == Colors.white ? Colors.grey : Colors.white;
print("color set to $color");
}
@override
bool updateShouldNotify(ColorDefinition oldWidget) =>
color != oldWidget.color;
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var color = ColorDefinition.of(context).color;
return new Container(
color: color,
child: new Column(
children: <Widget>[
new RaisedButton(
child: new Text("next"),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new SecondPage()),
);
}),
],
),
);
}
}
void main() => runApp(
new MaterialApp(
builder: (context, child) => new SafeArea(
child: new ColorDefinition(child: child),
),
home: new FirstPage(),
),
);
Si vous utilisez le widget hérité, vous n'avez pas à vous soucier de surveiller le pop de la page que vous avez poussé, ce qui fonctionnera pour les cas d'utilisation de base mais peut finir par poser des problèmes dans un scénario plus complexe.
1 votes
Pas de réponse, juste un commentaire général : dans mon cas, ce qui m'a amené à chercher ici serait résolu avec une simple méthode de synchronisation pour shared_preferences où je suis assuré de récupérer une préfixe mise à jour que j'ai écrite il y a un instant dans une autre page :-) Même l'utilisation de .then(...) ne me permet pas toujours d'obtenir les données mises à jour en attente d'écriture.
1 votes
Je viens de renvoyer une valeur de la nouvelle page sur pop, ce qui a résolu mon problème. Voir flutter.dev/docs/cookbook/navigation/returning-data
0 votes
Il faut voir ça : stackoverflow.com/a/64006691/10563627