Có một số điều bạn có thể làm ở đây. Câu trả lời của @ Mahi trong khi đúng có thể ngắn gọn hơn một chút và thực sự sử dụng push chứ không phải showDialog như OP đã hỏi. Đây là một ví dụ sử dụng 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(),
),
);
Tuy nhiên, có một cách khác để làm điều này có thể phù hợp với trường hợp sử dụng của bạn. Nếu bạn đang sử dụng global
làm thứ ảnh hưởng đến việc xây dựng trang đầu tiên của mình, bạn có thể sử dụng InheritedWidget để xác định tùy chọn người dùng toàn cầu của mình và mỗi khi chúng được thay đổi, FirstPage của bạn sẽ xây dựng lại. Điều này thậm chí hoạt động trong một tiện ích không trạng thái như được hiển thị bên dưới (nhưng cũng sẽ hoạt động trong một tiện ích trạng thái).
Một ví dụ về inheritWidget in flashing là Chủ đề của ứng dụng, mặc dù họ xác định nó trong một widget thay vì để nó trực tiếp xây dựng như tôi có ở đây.
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(),
),
);
Nếu bạn sử dụng tiện ích con kế thừa, bạn không phải lo lắng về việc xem cửa sổ bật lên của trang bạn đã đẩy, điều này sẽ hoạt động cho các trường hợp sử dụng cơ bản nhưng cuối cùng có thể gặp sự cố trong một tình huống phức tạp hơn.