【问题标题】:how to use setState() from another class or file?如何从另一个类或文件中使用 setState()?
【发布时间】:2020-05-13 22:21:51
【问题描述】:

我想从 CustomDialog 更改 HomeScreen 的主体,它是另一个类。我怎样才能做到这一点 ?无论如何我都试过了,但我不能这样做。

这是主文件

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: HomeScreen(),));

class HomeScreen extends StatefulWidget {
@override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return SafeArea(child:Column(
      children: <Widget>[
        Text( Global.number.toString() ),
        RaisedButton(child: Text("Click"),
          onPressed: (){
            showDialog(context: context,builder: (context){
              return CustomDialog();
            });
          },)
      ],
    ));
  }
}

这是另一个存储全局变量的文件

class Global {
  static double number = 10.0;
}

这个文件是给Dialog的

class CustomDialog extends StatefulWidget {
  @override
  _CustomDialogState createState() => _CustomDialogState();
}

class _CustomDialogState extends State<CustomDialog> {
  @override
  Widget build(BuildContext context) {
    return Dialog(child: FlatButton(
      child: Icon(Icons.add_circle,size: 30,),
      onPressed: (){
        setState(() {
          Global.number++;
        });
      },
    ),);
  }
}

【问题讨论】:

    标签: android flutter dart setstate iso


    【解决方案1】:

    您可以将HomeScreensetState 方法传递给CustomDialog。我根据您在下面提供的代码分享了一个完整的工作示例。

    import 'package:flutter/material.dart';
    
    void main() => runApp(MaterialApp(home: HomeScreen(),));
    
    class HomeScreen extends StatefulWidget {
    @override
      _HomeScreenState createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
      void state() {
        setState((){});
      }
    
      @override
      Widget build(BuildContext context) {
        return SafeArea(child:Column(
          children: <Widget>[
            Text( Global.number.toString() ),
            RaisedButton(child: Text("Click"),
              onPressed: (){
                showDialog(context: context,builder: (context){
                  return CustomDialog(state);
                });
              },)
          ],
        ));
      }
    }
    
    class Global {
      static double number = 10.0;
    }
    
    
    class CustomDialog extends StatefulWidget {
      final Function state;
      CustomDialog(this.state);
    
      @override
      _CustomDialogState createState() => _CustomDialogState();
    }
    
    class _CustomDialogState extends State<CustomDialog> {
      @override
      Widget build(BuildContext context) {
        return Dialog(child: FlatButton(
          child: Icon(Icons.add_circle,size: 30,),
          onPressed: (){
              Global.number++;
              widget.state();
          },
        ),);
      }
    }
    

    如您所见,我为CustomDialog 创建了一个方法参数,并在Global.number 更改后调用该方法。我为setState 函数创建了一个包装器

    void state() {
      setState((){});
    }
    

    HomeScreen 中并将该方法作为参数传递给CustomDialog

    【讨论】:

    • 非常感谢,你帮了我很多))
    【解决方案2】:

    CustomDialog 中的 stateset 是...the state of the dialog,而不是主屏幕。

    要通知主屏幕某些数据已更改,您可以使用ChangeNotifierProvider 在主屏幕和对话框的通用super 小部件中提供此数据,订阅主屏幕中的数据,然后访问数据在对话框中更改它,然后主屏幕将自动重建。

    请查看Simple app state management了解更多详情。

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 2021-05-04
      • 1970-01-01
      • 2019-07-14
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      相关资源
      最近更新 更多