Flutter 在弹出式导航上刷新另一个类的状态
我有一个应用程序,它在一个类中包含脚手架,在另一个类中包含小部件的主体。脚手架上的一个按钮打开“设置”菜单以更改显示设置。由于此按钮位于脚手架上,并且主体位于另一个类中,因此我无法让主体在从“设置”菜单返回后重置其状态并重建。我应该如何告诉LocalCalculator类从ScaffoldCalc类中设置状态Flutter 在弹出式导航上刷新另一个类的状态,flutter,Flutter,我有一个应用程序,它在一个类中包含脚手架,在另一个类中包含小部件的主体。脚手架上的一个按钮打开“设置”菜单以更改显示设置。由于此按钮位于脚手架上,并且主体位于另一个类中,因此我无法让主体在从“设置”菜单返回后重置其状态并重建。我应该如何告诉LocalCalculator类从ScaffoldCalc类中设置状态 class _ScaffoldCalcState extends State<ScaffoldCalc> { @override void initState() {
class _ScaffoldCalcState extends State<ScaffoldCalc> {
@override
void initState() {
super.initState();
checkDisclaimer();
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
ExcludeSemantics(
excluding: showCalcDisclaimer,
child:Scaffold(
appBar: AppBar(
title: const Text('Local Anesthetic Calculator'),
backgroundColor: MyColors.PrimaryColor1,
centerTitle: false,
elevation: 0,
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings, semanticLabel: "Settings Menu",),
onPressed: () {
AutoOrientation.fullAutoMode();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SettingsMenu()),
).then((value) {
//Run after return from settings
AutoOrientation.portraitAutoMode();
});
},
),
]
),
body: LocalCalculator(),
),
),
],
);
}
}
class LocalCalculator extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _LACalcState();
}
}
class _LACalcState extends State<LocalCalculator> with TickerProviderStateMixin{
@override
void initState() {
super.initState();
AutoOrientation.portraitAutoMode();
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
}
//Build our widget tree
@override
Widget build(BuildContext context) {
return Material(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
bupivacaine.hideEditing();
ropivacaine.hideEditing();
mepivacaine.hideEditing();
lidocaine.hideEditing();
chloroprocaine.hideEditing();
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
//CalcHeader(),
WeightDisplay(),
DrugCardHeader(),
DrugCardList(),
],
),
),
);
}
}
class\u ScaffoldCalcState扩展状态{
@凌驾
void initState(){
super.initState();
检查免责声明();
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
排除语义学(
不包括:showCalcDisclaimer,
孩子:脚手架(
appBar:appBar(
标题:const Text(“局部麻醉计算器”),
背景颜色:MyColors.PrimaryColor1,
标题:错误,
海拔:0,
行动:[
图标按钮(
图标:图标(Icons.settings,语义标签:“设置菜单”,),
已按下:(){
AutoOrientation.fullAutoMode();
导航器。推(
上下文
MaterialPage路由(生成器:(上下文)=>SettingsMenu()),
).然后((值){
//从设置返回后运行
AutoOrientation.automode();
});
},
),
]
),
正文:LocalCalculator(),
),
),
],
);
}
}
类LocalCalculator扩展StatefulWidget{
@凌驾
状态createState(){
返回_LACalcState();
}
}
类LACalcState使用TickerProviderStateMixin扩展状态{
@凌驾
void initState(){
super.initState();
AutoOrientation.automode();
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
}
//构建我们的小部件树
@凌驾
小部件构建(构建上下文){
退货(
儿童:手势检测器(
行为:HitTestBehavior.transparent,
onTap:(){
FocusScope.of(context).requestFocus(newfocusnode());
布比卡因。隐藏();
罗哌卡因。隐藏();
甲哌卡因。隐藏();
利多卡因。隐藏();
氯普鲁卡因。隐藏();
},
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
//CalcHeader(),
WeightDisplay(),
DrugCardHeader(),
DrugCardList(),
],
),
),
);
}
}
当您需要更改任何小部件(例如整个应用程序)时
完成一些任务后,我们需要刷新应用程序
使用setState(),setState()刷新小部件的整个状态,并
作为您的代码,您可以在导航器之后编写setState,然后
设置状态重建身体并重新加载所有小部件
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SettingsMenu()))
.then((value) {
//Run after return from settings
setState(() {});
AutoOrientation.portraitAutoMode();
});
虽然setState对于管理有状态小部件类中的状态非常有效,但您可以使用更好的状态管理方法,比如在多个小部件类之间共享公共状态 颤振负责在状态更改时用更新的值重新加载所有小部件(使用此状态)。有关更多详细信息,请参见《颤振》中的这一部分 检查此示例代码,该代码扩展了提供程序支持,以管理
设置页面内计数器的状态以及本地计算器页面中正在更新的值
不要忘记在主类的runApp方法中绑定providerMyProvider
类ScaffoldCalc扩展StatefulWidget{
@凌驾
状态createState(){
返回_ScaffoldCalcState();
}
}
类_ScaffoldCalcState扩展状态{
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
排除语义学(
不包括:假,
孩子:脚手架(
appBar:appBar(
标题:const Text(“局部麻醉计算器”),
背景颜色:Colors.blue,
标题:错误,
海拔:0,
行动:[
图标按钮(
图标:图标(Icons.settings,语义标签:“设置菜单”,),
已按下:(){
导航器。推(
上下文
MaterialPage路由(生成器:(上下文)=>SettingsPage()),
).然后((值){
//从设置返回后运行
});
},
),
]
),
正文:LocalCalculator(),
),
),
],
);
}
}
类设置SPAGE扩展StatefulWidget{
@凌驾
状态createState(){
返回_SettingsPageState();
}
}
类_设置孕母扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“新页面”),),
浮动操作按钮:换行(
方向:轴垂直,
间距:10.0,
儿童:[
浮动操作按钮(
heroTag:“晶圆厂添加”,
背景颜色:Colors.green,
子:图标(Icons.add),
已按下:(){
Provider.of(context,listen:false).increment();
},
),
浮动操作按钮(
heroTag:“晶圆减法”,
背景颜色:Colors.red,
子:图标(图标。删除),
已按下:(){
Provider.of(context,listen:false).decrement();
},
class ScaffoldCalc extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _ScaffoldCalcState();
}
}
class _ScaffoldCalcState extends State<ScaffoldCalc> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
ExcludeSemantics(
excluding: false,
child:Scaffold(
appBar: AppBar(
title: const Text('Local Anesthetic Calculator'),
backgroundColor: Colors.blue,
centerTitle: false,
elevation: 0,
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings, semanticLabel: "Settings Menu",),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SettingsPage()),
).then((value) {
//Run after return from settings
});
},
),
]
),
body: LocalCalculator(),
),
),
],
);
}
}
class SettingsPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _SettingsPageState();
}
}
class _SettingsPageState extends State<SettingsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("New page"),),
floatingActionButton: Wrap(
direction: Axis.vertical,
spacing: 10.0,
children: <Widget>[
FloatingActionButton(
heroTag: "fab-add",
backgroundColor: Colors.green,
child: Icon(Icons.add),
onPressed: (){
Provider.of<MyProvider>(context,listen: false).increment();
},
),
FloatingActionButton(
heroTag: "fab-subtract",
backgroundColor: Colors.red,
child: Icon(Icons.remove),
onPressed: (){
Provider.of<MyProvider>(context,listen: false).decrement();
},
),
],
),
);
}
}
class MyProvider extends ChangeNotifier {
double state = 1.0;
void increment() {
state += 1;
notifyListeners();
}
void decrement() {
state -= 1;
notifyListeners();
}
}
class LocalCalculator extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _LACalcState();
}
}
class _LACalcState extends State<LocalCalculator> with TickerProviderStateMixin{
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
}
//Build our widget tree
@override
Widget build(BuildContext context) {
return Material(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
},
child: Center(
child: Text("Count is : ${Provider.of<MyProvider>(context).state}"),
),
),
);
}
}