Es gibt ein paar Dinge, die Sie hier tun könnten. @ Mahis Antwort, obwohl sie korrekt ist, könnte etwas prägnanter sein und tatsächlich Push anstelle von showDialog verwenden, nach dem das OP gefragt hat. Dies ist ein Beispiel, das Folgendes verwendet Navigator.push
:
import 'package:flutter/material.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Container(
color: Colors.green,
child: new Column(
children: <Widget>[
new RaisedButton(
onPressed: () => Navigator.pop(context),
child: new 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: new Column(
children: <Widget>[
new RaisedButton(
child: new Text("next"),
onPressed: () {
Navigator
.push(
context,
new MaterialPageRoute(builder: (context) => new SecondPage()),
)
.then((value) {
setState(() {
color = color == Colors.white ? Colors.grey : Colors.white;
});
});
}),
],
),
);
}
}
void main() => runApp(
new MaterialApp(
builder: (context, child) => new SafeArea(child: child),
home: new FirstPage(),
),
);
Es gibt jedoch eine andere Möglichkeit, die zu Ihrem Anwendungsfall passt. Wenn Sie das global
als etwas verwenden, das sich auf die Erstellung Ihrer ersten Seite auswirkt, können Sie ein InheritedWidget verwenden , um Ihre globalen Benutzereinstellungen zu definieren. Bei jeder Änderung wird Ihre FirstPage neu erstellt. Dies funktioniert sogar in einem zustandslosen Widget, wie unten gezeigt (sollte aber auch in einem zustandsbehafteten Widget funktionieren).
Ein Beispiel für vererbtes Widget im Flattern ist das Design der App, obwohl es innerhalb eines Widgets definiert wird, anstatt es wie hier direkt erstellen zu lassen.
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Container(
color: Colors.green,
child: new Column(
children: <Widget>[
new 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(),
),
);
Wenn Sie ein geerbtes Widget verwenden, müssen Sie sich keine Gedanken darüber machen, ob die von Ihnen gepusste Seite angezeigt wird. Dies funktioniert für grundlegende Anwendungsfälle, kann jedoch in einem komplexeren Szenario zu Problemen führen.