被标记为@immutable的类,实例字段不是final的情况下,可以使用StatefulWidget来解决。
首先,创建一个继承自StatefulWidget的类,并在该类中定义一个内部类继承自State。在State类中,声明需要修改的实例字段,并在build方法中使用它们。
下面是一个示例代码:
import 'package:flutter/material.dart';
@immutable
class MyImmutableClass {
final int id;
final String name;
const MyImmutableClass(this.id, this.name);
}
class MyMutableClass extends StatefulWidget {
@override
State createState() => _MyMutableClassState();
}
class _MyMutableClassState extends State {
int id;
String name;
@override
void initState() {
super.initState();
// 初始化字段的值
id = 1;
name = "John";
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("ID: $id"),
Text("Name: $name"),
RaisedButton(
child: Text("Update"),
onPressed: () {
setState(() {
// 更新字段的值
id = 2;
name = "Jane";
});
},
),
],
),
),
);
}
}
void main() {
runApp(MaterialApp(
home: MyMutableClass(),
));
}
在上面的示例中,MyImmutableClass被标记为@immutable,但它的实例字段不是final的。为了修改这些字段,我们创建了一个继承自StatefulWidget的类MyMutableClass,并在该类中定义了一个内部类_MyMutableClassState,继承自State。在_MyMutableClassState中,我们声明了需要修改的实例字段id和name,并在build方法中使用它们。
在点击按钮时,我们调用setState方法来更新字段的值,这将触发Flutter重新构建UI。注意,在State类中修改字段需要调用setState方法,以通知Flutter进行重建。
这样,我们就可以在被标记为@immutable的类中修改实例字段的值,并使用StatefulWidget来管理它们。
上一篇:被标记的人获得新角色
下一篇:被标记为非凸优化问题