如何将数据从statefulwidget传递到setState

时间:2020-11-01 22:37:59

标签: flutter

我用最终变量(例如密码)创建一个statefullwidget。 但是当我需要从扩展statefullwidget到setstate获取数据时,它显示错误

class Inputtextfield extends StatefulWidget {
  const Inputtextfield({
    Key key, this.label, this.onChange, this.password = false,
  }) : super(key: key);

  final String label;
  final Function onChange;
  final bool password;

  @override
  _InputtextfieldState createState() => _InputtextfieldState();
}

class _InputtextfieldState extends State<Inputtextfield> {
  
void _togglevisibility(){
    setState(() {
      widget.password =  !widget.password;
    });

}

我需要将其更改为Toggle,在setState错误中说password can't be setter,cause it final,我尝试用Ctrl + . -> Make 'password' Not Final修复错误,并进行了扩展statefullWidget的错误移动

3 个答案:

答案 0 :(得分:1)

final关键字可防止您重新分配其值。最好保持小部件构造函数的变量不变,并在State本身中创建一个可变变量。
因此,要更改变量,您需要执行以下操作:

class _InputtextfieldState extends State<Inputtextfield> { 

    bool _password;

    @override
    void initState() {
        super.initState();
        _password = widget.password;
    }

    void _togglevisibility(){ 
        setState(() { 
            // now, you can modify it
            _password = !_password; 
        }); 
    }
}

您可以阅读有关此讨论的更多信息:https://groups.google.com/g/flutter-dev/c/zRnFQU3iZZs/m/JX9ei27CBwAJ?pli=1

答案 1 :(得分:0)

很简单。 Final个变量只能设置为ONCE。设置它们后,它们将无法更改。

 final bool password = true; // this value cannot be changed again

在您的情况下,如果要更新password的值,则必须通过删除Not Final关键字使它成为final,即:

bool password = false;  // this can now be changed later using `setState()`

答案 2 :(得分:0)

  1. 输入密码不是最终密码。
  2. 从构造函数中删除“ const”