Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在弹出式导航上刷新另一个类的状态_Flutter - Fatal编程技术网

Flutter 在弹出式导航上刷新另一个类的状态

Flutter 在弹出式导航上刷新另一个类的状态,flutter,Flutter,我有一个应用程序,它在一个类中包含脚手架,在另一个类中包含小部件的主体。脚手架上的一个按钮打开“设置”菜单以更改显示设置。由于此按钮位于脚手架上,并且主体位于另一个类中,因此我无法让主体在从“设置”菜单返回后重置其状态并重建。我应该如何告诉LocalCalculator类从ScaffoldCalc类中设置状态 class _ScaffoldCalcState extends State<ScaffoldCalc> { @override void initState() {

我有一个应用程序,它在一个类中包含脚手架,在另一个类中包含小部件的主体。脚手架上的一个按钮打开“设置”菜单以更改显示设置。由于此按钮位于脚手架上,并且主体位于另一个类中,因此我无法让主体在从“设置”菜单返回后重置其状态并重建。我应该如何告诉LocalCalculator类从ScaffoldCalc类中设置状态

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}"),
        ),
      ),
    );
  }
}