Możesz tutaj zrobić kilka rzeczy. Odpowiedź @ Mahi, chociaż poprawna, mogłaby być nieco bardziej zwięzła i faktycznie używać wypychania zamiast showDialog, o co pytał OP. Oto przykład wykorzystujący 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(),
),
);
Jest jednak inny sposób na zrobienie tego, który może dobrze pasować do twojego przypadku użycia. Jeśli używasz global
jako czegoś, co wpływa na kompilację Twojej pierwszej strony, możesz użyć InheritedWidget, aby zdefiniować swoje globalne preferencje użytkownika, a za każdym razem, gdy zostaną one zmienione, Twoja FirstPage zostanie odbudowana. Działa to nawet w widgecie bezstanowym, jak pokazano poniżej (ale powinno również działać w widgecie stanowym).
Przykładem inheritedWidget in flutter jest motyw aplikacji, chociaż definiują go w widżecie, zamiast budować go bezpośrednio, tak jak tutaj.
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(),
),
);
Jeśli używasz dziedziczonego widżetu, nie musisz się martwić o wypatrywanie popchniętej strony, która będzie działać w podstawowych przypadkach użycia, ale może skończyć się problemami w bardziej złożonym scenariuszu.