如何在有状态小部件中编辑最终对象

时间:2019-12-01 15:36:25

标签: flutter dart

我的应用程序(有状态的小部件)中有一个页面,该页面具有几个字段并创建一个对象(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

1 个答案:

答案 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
    }
}