Ada beberapa hal yang dapat Anda lakukan di sini. Jawaban @ Mahi sementara benar bisa jadi sedikit lebih ringkas dan benar-benar menggunakan push daripada showDialog seperti yang ditanyakan OP. Ini adalah contoh yang menggunakan 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(),
),
);
Namun, ada cara lain untuk melakukan ini yang mungkin sesuai dengan kasus penggunaan Anda. Jika Anda menggunakan global
sebagai sesuatu yang mempengaruhi pembuatan halaman pertama Anda, Anda dapat menggunakan InheritedWidget untuk menentukan preferensi pengguna global Anda, dan setiap kali mereka diubah FirstPage Anda akan dibangun kembali. Ini bahkan berfungsi dalam widget stateless seperti yang ditunjukkan di bawah ini (tetapi harus berfungsi dalam widget stateful juga).
Contoh inheritedWidget dalam flutter adalah Tema aplikasi, meskipun mereka mendefinisikannya dalam widget alih-alih membuatnya langsung dibangun seperti yang saya miliki di sini.
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(),
),
);
Jika Anda menggunakan widget yang diwariskan, Anda tidak perlu khawatir tentang melihat sembulan halaman yang Anda dorong, yang akan berfungsi untuk kasus penggunaan dasar tetapi mungkin berakhir dengan masalah dalam skenario yang lebih kompleks.