Burada yapabileceğiniz birkaç şey var. @ Mahi'nin yanıtı doğruyken biraz daha özlü olabilir ve OP'nin sorduğu gibi showDialog yerine aslında itmeyi kullanabilir. Bu, Navigator.push
şunları kullanan bir örnektir :
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(),
),
);
Ancak, bunu yapmanın kullanım durumunuza iyi uyan başka bir yolu var. global
İlk sayfanızın yapısını etkileyen bir şey olarak kullanıyorsanız, bir InheritedWidget kullanabilirsiniz. genel kullanıcı tercihlerinizi tanımlamak için ve her değiştirildiğinde FirstPage yeniden oluşturulur. Bu, aşağıda gösterildiği gibi durum bilgisi olmayan bir pencere öğesinde bile çalışır (ancak durum bilgisi olan bir pencere öğesinde de çalışmalıdır).
Flutter'daki inheritedWidget'in bir örneği, uygulamanın Temasıdır, ancak benim burada olduğu gibi doğrudan inşa etmek yerine onu bir widget içinde tanımlıyorlar.
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(),
),
);
Devralınan pencere öğesini kullanırsanız, ittiğiniz sayfanın pop-up'ını izleme konusunda endişelenmenize gerek kalmaz, bu temel kullanım durumları için işe yarar, ancak daha karmaşık bir senaryoda sorun yaşamanıza neden olabilir.