我的应用程序(有状态的小部件)中有一个页面,该页面具有几个字段并创建一个对象(Contract
)。我想使用同一页面来允许用户编辑同一对象。
我要实现的逻辑是,如果将对象传递给页面,则使用该对象,否则创建一个新对象。问题在于该对象必须为final
,因此在将null
传递给它之后,我无法更改它(这意味着它应该是一个新对象)。
如果我必须有两个页面几乎都相同(一个页面要编辑,一个页面要创建),这似乎是多余的。
当前代码:
class ContractEditPage extends StatefulWidget {
final Contract contract;
ContractEditPage({Key key, this.contract}) : super(key: key);
@override
_ContractEditPageState createState() => _ContractEditPageState();
}
class _ContractEditPageState extends State<ContractEditPage> {
bool editMode = false;
@override
void initState() {
super.initState();
// Check it editting contract
if (widget.contract != null) editMode = true;
// Generate Default Reminders
if (!editMode) {
//Create a new contract
widget.contract = Contract(); // <= This is not allowed since contract is final
else
{
//Use existing contract for field values
}
}
... // Build method below
答案 0 :(得分:1)
有多种方法可以解决您的问题之一,而无需多少更改您当前的逻辑:
class ContractEditPage extends StatefulWidget {
final Contract contract;
ContractEditPage({Key key, this.contract}) : super(key: key);
@override
_ContractEditPageState createState() => _ContractEditPageState();
}
class _ContractEditPageState extends State<ContractEditPage> {
bool editMode = false;
Contract _contract; // ----------> Add this
@override
void initState() {
super.initState();
_contract = widget.contract;
// Check it editing contract
if (_contract != null) editMode = true;
// Generate Default Reminders
if (!editMode) {
//Create a new contract
_contract = Contract(); // ----------> Here is the change
else
{
//Use existing contract for field values
}
}