वहाँ कुछ चीजें आप यहाँ कर सकते हैं। @ माही का उत्तर सही होने के बाद थोड़ा अधिक रसीला हो सकता है और वास्तव में शो डाइलॉग के बजाय पुश का उपयोग कर सकता है जैसा कि ओपी के बारे में पूछ रहा था। यह एक उदाहरण है जो उपयोग करता है 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(),
),
);
हालांकि, ऐसा करने का एक और तरीका है जो आपके उपयोग-मामले को अच्छी तरह से फिट कर सकता है। आप उपयोग कर रहे हैं global
अपने प्रथम पृष्ठ के निर्माण को प्रभावित करता है कि कुछ के रूप में, आप एक इस्तेमाल कर सकते हैं InheritedWidget अपने वैश्विक उपयोगकर्ता वरीयताओं को परिभाषित करने के लिए, और जब भी बदल रहे हैं अपने FirstPage पुनर्निर्माण करेंगे। यह भी एक स्टेटलेस विजेट के भीतर काम करता है जैसा कि नीचे दिखाया गया है (लेकिन एक स्टेटफुल विजेट में भी काम करना चाहिए)।
स्पंदन में विरासत में मिली एक मिसाल ऐप का थीम है, हालांकि वे इसे सीधे विजेट के बजाय एक विजेट के भीतर परिभाषित करते हैं जैसा कि मैंने यहां किया है।
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(),
),
);
यदि आप विरासत में दिए गए विजेट का उपयोग करते हैं, तो आपको उस पृष्ठ के पॉप को देखने के लिए परेशान होने की ज़रूरत नहीं है, जो बुनियादी उपयोग के मामलों के लिए काम करेगा, लेकिन अधिक जटिल परिदृश्य में समस्याएँ हो सकती हैं।