假设我的页面上有一些滑块和开关,我更改了它们的状态并修改了它们,我知道我们这样做是setState为了显示小部件树的更改状态并重建它,但我想知道是否有办法撤消所有这些更改并返回到初始状态(应用程序最初构建时的状态)?
如果你想开箱即用
void main() => runApp(MaterialApp(home: DummyWidget()));
class DummyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) => HomePage();
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool _enabled = false; // For Switch
double _value = 0; // For Slider
// This is the trick!
void _reset() {
Navigator.pushReplacement(
context,
PageRouteBuilder(
transitionDuration: Duration.zero,
pageBuilder: (_, __, ___) => DummyWidget(),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Switch(
value: _enabled,
onChanged: (newValue) => setState(() => _enabled = newValue),
),
Slider(
value: _value,
onChanged: (newValue) => setState(() => _value = newValue),
),
FlatButton(
onPressed: _reset,
child: Text('RESET'),
),
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
更好的方法可能是使用密钥。这是关键方法
一个简单的技巧是使用相同的路线弹出和推送。像这样:
Navigator.popAndPushNamed(context, "same_route");
Run Code Online (Sandbox Code Playgroud)
截屏:
用于key改变状态。
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: HomePage()));
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: KeyedSubtree(
key: ValueKey<int>(_count),
child: Column(
children: [
MainPage(),
ElevatedButton(
onPressed: () => setState(() => ++_count),
child: Text('RESET'),
)
],
),
),
);
}
}
class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
bool _enabled = false; // For Switch
double _value = 0; // For Slider.
@override
Widget build(BuildContext context) {
return Column(
children: [
Switch(
value: _enabled,
onChanged: (newValue) => setState(() => _enabled = newValue),
),
Slider(
value: _value,
onChanged: (newValue) => setState(() => _value = newValue),
),
],
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9769 次 |
| 最近记录: |