这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:
Posted
技术标签:
【中文标题】这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:【英文标题】:This class is marked as '@immutable', but one or more of its instance fields are not final: 【发布时间】:2020-01-15 15:12:05 【问题描述】:如果我将变量声明为 final,那么我想要更改(按下时)的值(变量)在 setState()
中,因此可以更改这些变量如何防止这种情况发生?
还有,为什么写成widget.value
?
我尝试过使用 static 而不是 final 不起作用
class BottomCard extends StatefulWidget
String title;
int value;
@override
_BottomCardState createState() => _BottomCardState();
class _BottomCardState extends State<BottomCard> .....
....<Widget>[
FloatingActionButton(
elevation: 0,
child: Icon(FontAwesomeIcons.plus),
onPressed: ()
setState(()
widget.value++;
);
,
backgroundColor: Color(0xFF47535E),
),
【问题讨论】:
【参考方案1】:如果您不需要从外部类获取变量(标题和值)。您可以在_BottomCardState
类中声明它们并根据需要使用它们。
喜欢这段代码。
class BottomCardState extends StatefulWidget
@override
_BottomCardStateState createState() => _BottomCardStateState();
class _BottomCardStateState extends State<BottomCardState>
int _value;
String title;
@override
void initState()
super.initState();
_value = 0;
title = "any thing";
@override
Widget build(BuildContext context)
return Scaffold(
floatingActionButton: FloatingActionButton(
elevation: 0,
child: Icon(FontAwesomeIcons.plus),
onPressed: ()
setState(()
_value++; // increment value here
);
,
),
);
如果您需要从其他类中获取变量(值和标题)。那么您需要
1-将它们标记为 final 。
2-从构造函数中获取它们
要在_BottomCardStateState
中访问它们的值,您需要使用widget._value
访问它们。它们是最终的,您无法修改它们。
喜欢这里的代码
class App extends StatelessWidget
const App(Key key) : super(key: key);
@override
Widget build(BuildContext context)
return Container(
child: BottomCardState(2,"some thing"),
);
class BottomCardState extends StatefulWidget
final int _value;
final String title;
BottomCardState(this._value,this.title)
@override
_BottomCardStateState createState() => _BottomCardStateState();
class _BottomCardStateState extends State<BottomCardState>
int value ;
@override
Widget build(BuildContext context)
value = widget._value ;
return Scaffold(
floatingActionButton: FloatingActionButton(
elevation: 0,
child: Icon(FontAwesomeIcons.plus),
onPressed: ()
setState(()
value++; // increment value here
);
,
),
);
【讨论】:
@chaitanyaHarde,不客气 :)。如果它解决了您的问题,您可以将其标记为已解决。【参考方案2】:如果我将变量声明为最终变量,那么我想要更改(按下时)的值(变量)处于设置状态(),因此可以更改这些变量如何防止这种情况发生?
扩展StatefulWidget
。
还有为什么要写widget.value?
这意味着您正在您的StatefulWidget
子类中访问value
,并且该值实际上是在您的State
类中定义的。
完整代码应如下所示:
class BottomCardState extends StatefulWidget
@override
_BottomCardStateState createState() => _BottomCardStateState();
class _BottomCardStateState extends State<BottomCardState>
int _value = 0; // set value here
@override
Widget build(BuildContext context)
return Scaffold(
floatingActionButton: FloatingActionButton(
elevation: 0,
child: Icon(FontAwesomeIcons.plus),
onPressed: ()
setState(()
_value++; // increment value here
);
,
),
);
【讨论】:
以上是关于这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:的主要内容,如果未能解决你的问题,请参考以下文章
警告:失败的道具类型:道具`children`在`Query`中被标记为必需,但它的值是`undefined`
属性不能被标记为@NSManaged,因为它的类型不能在 Objective-C 中表示
多线程----Immutable VS Mutable (可变与不可变)