Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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_Flutter Widget_Flutter State_Statelesswidget - Fatal编程技术网

Flutter 无状态小部件可以包含成员变量吗?

Flutter 无状态小部件可以包含成员变量吗?,flutter,flutter-widget,flutter-state,statelesswidget,Flutter,Flutter Widget,Flutter State,Statelesswidget,我有一个无状态小部件,它使用范围模型存储数据。小部件基本上提供了一个复选框列表和一些保存复选框状态的按钮 现在,我想跟踪用户是否更改了任何复选框,即,自从小部件显示以来,是否已选中/取消选中它们。所以我加了这样的东西: class MyCheckboxScreen extends StatelessWidget{ bool _hasBeenModified = false; void _itemCheckedChange(bool checked, MyModel model

我有一个
无状态小部件
,它使用
范围模型
存储数据。小部件基本上提供了一个复选框列表和一些保存复选框状态的按钮

现在,我想跟踪用户是否更改了任何复选框,即,自从小部件显示以来,是否已选中/取消选中它们。所以我加了这样的东西:

class MyCheckboxScreen extends StatelessWidget{

    bool _hasBeenModified = false;

    void _itemCheckedChange(bool checked, MyModel model){
        _hasBeenModified = true;

        // Code to change the model here
    }


    void _onCloseButton(){
        if( _hasBeenModified ){
            // Show a warning that there are modifications that will not be be saved
        }
    }


    void _onSaveButton(Context context, MyModel model){
        model.save();
        Navigator.of(context).pop();
    }

}
class MyWidget extends StatelessWidget {
  final int a;
  final String b;
  const MyWidget(this.a, this.b);
}
这似乎可行,但我的
无状态小部件
现在包含自己的状态

该状态不用于更新UI和重新绘制任何内容,它仅用于在按下“关闭”按钮时检查是否对任何复选框进行了修改

无状态小部件
具有这种内部状态安全吗?还是会有问题?例如,是否会意外地重新创建小部件,并且内部状态会丢失

我觉得这个问题不是很清楚,它只是说

<>对于动态变化的组成,例如由于具有内部时钟驱动状态,或者依赖于某些系统状态,考虑使用StuteFultWIDGET。


但这听起来似乎只适用于影响UI并需要重新构建小部件的状态。

有什么理由不使用有状态小部件吗?无状态小部件不打算以这种方式使用。。在没有任何好处的情况下,我不明白你为什么要把事情过度复杂化。

你为什么不使用有状态的小部件?无状态小部件不打算以这种方式使用。。如果没有任何好处,我不明白你为什么要把事情复杂化。

是的,
无状态小部件可以有可变变量(你的代码可以编译),但这是错误的

不需要可变状态的小部件

这是从地图上截取的。即使只有一个非最终变量,也意味着小部件中的某些内容实际上可以更改。它不是一个不变的类。理想情况下,您应该像这样使用
无状态widget
s:

class MyCheckboxScreen extends StatelessWidget{

    bool _hasBeenModified = false;

    void _itemCheckedChange(bool checked, MyModel model){
        _hasBeenModified = true;

        // Code to change the model here
    }


    void _onCloseButton(){
        if( _hasBeenModified ){
            // Show a warning that there are modifications that will not be be saved
        }
    }


    void _onSaveButton(Context context, MyModel model){
        model.save();
        Navigator.of(context).pop();
    }

}
class MyWidget extends StatelessWidget {
  final int a;
  final String b;
  const MyWidget(this.a, this.b);
}
或者类似的东西,比如

class MyWidget extends StatelessWidget {
  const MyWidget();
}
如果有非最终变量,请使用
StatefulWidget
。您的类必须是一个明确的
StatefulWidget

// This is not final. It can be changed (and you will change it)
// so using the stateless way is wrong
bool _hasBeenModified = false;

void _itemCheckedChange(bool checked, MyModel model){
  _hasBeenModified = true;
}

UI实际上并不重要,因为这里有一个变量和易变性的问题。有些东西正在改变(
bool\u已被修改),因此它不能是
无状态小部件
,因为它必须在状态为不可变的所有情况下使用

是的,
无状态小部件
可以有可变变量(您的代码编译),但这是错误的

不需要可变状态的小部件

这是从地图上截取的。即使只有一个非最终变量,也意味着小部件中的某些内容实际上可以更改。它不是一个不变的类。理想情况下,您应该像这样使用
无状态widget
s:

class MyCheckboxScreen extends StatelessWidget{

    bool _hasBeenModified = false;

    void _itemCheckedChange(bool checked, MyModel model){
        _hasBeenModified = true;

        // Code to change the model here
    }


    void _onCloseButton(){
        if( _hasBeenModified ){
            // Show a warning that there are modifications that will not be be saved
        }
    }


    void _onSaveButton(Context context, MyModel model){
        model.save();
        Navigator.of(context).pop();
    }

}
class MyWidget extends StatelessWidget {
  final int a;
  final String b;
  const MyWidget(this.a, this.b);
}
或者类似的东西,比如

class MyWidget extends StatelessWidget {
  const MyWidget();
}
如果有非最终变量,请使用
StatefulWidget
。您的类必须是一个明确的
StatefulWidget

// This is not final. It can be changed (and you will change it)
// so using the stateless way is wrong
bool _hasBeenModified = false;

void _itemCheckedChange(bool checked, MyModel model){
  _hasBeenModified = true;
}

UI实际上并不重要,因为这里有一个变量和易变性的问题。有些东西正在改变(
bool\u已经被修改了
),所以它不能是一个
无状态小部件
,因为它必须在所有状态为不可变的情况下使用,这不是真的,唯一的原因是现有屏幕是一个TelessWidget,我只需要在关闭它之前添加额外的检查。给出答案后,我会将其更改为StatefulWidget!谢谢。不是真的,唯一的原因是现有的屏幕是一个TelessWidget,我只需要在关闭它之前添加额外的检查。给出答案后,我会将其更改为StatefulWidget!谢谢