如何使用另一个类或文件中的setState()?

问题描述 投票:0回答:2

我想从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;
}

此文件用于对话框

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
2个回答
0
投票

您可以将setStateHomeScreen方法向下传递至CustomDialog。我已经根据您在下面提供的代码共享了一个完整的[[working示例。

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

0
投票
state中的setCustomDialog很好,... the state of the dialog,不是主屏幕。

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

请查看Simple app state management了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.