【问题标题】:Flutter immutability颤振不变性
【发布时间】:2020-03-18 02:08:41
【问题描述】:

我正在使用有状态小部件,并且必须声明最终变量才能从另一个页面接收数据。但是,我声明的 int 变量之一必须在同一页面上再次更改,因此我删除了 Final 并且代码工作正常,但它警告我:

“信息:这个类(或这个类继承自的类)被标记为'@immutable',但它的一个或多个实例字段不是最终的”。

我需要从其他页面发送计数值

   Navigator.of(context)
                  .push(MaterialPageRoute(builder: (BuildContext context) {
                return EditScheduleScreen(

                  count: widget.count + 1,

                );
              }));

但是这个计数值在我发送到的页面中再次更新:

          widget.count--;

因此我必须在没有 final 的情况下声明 int 值:

class EditScheduleScreen extends StatefulWidget {

  int count;

  EditScheduleScreen({
    Key key,  
    this.count,
  }) : super(key: key);

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

这给了我警告。

这是我应该担心的事情,还是有办法改变这个 int 的值并保持它为 Final(因为它需要从不同的页面接收)?

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    我正在使用有状态小部件,并且必须将最终变量声明为 从另一个页面接收数据。但是我拥有的 int 变量之一 声明必须再次在同一页面上更改,所以我删除了 最终,代码工作正常,但它警告我。

    它不会破坏您的代码,但最好不要尽可能避免警告。您可以将 count 的值分配给 state 类中的新变量,然后简单地将 count 设为 final 或 const 任何适合您的值。

    所以按照下面的风格做事的好处是它会首先删除警告,你也可以改变值。

    import 'package:flutter/material.dart';
    
    class EditScheduleScreen extends StatefulWidget {
      final int count;
    
      EditScheduleScreen({
        Key key,
        this.count,
      }) : super(key: key);
    
      @override
      _EditScheduleScreenState createState() => _EditScheduleScreenState();
    }
    
    class _EditScheduleScreenState extends State<EditScheduleScreen> {
      // Creating a variable to receive the count's value from the stateful class
      int stateCount;
    
      @override
      void initState() {
        super.initState();
        // Passing the count's value to stateCount variable
        stateCount = widget.count;
      }
    
      @override
      Widget build(BuildContext context) {
        return Center(
          child: FlatButton(
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (BuildContext context) {
                  return EditScheduleScreen(
                    count: stateCount + 1,
                  );
                }));
              },
              child: Text("Flat Button")),
        );
      }
    }
    

    【讨论】:

    • 我很高兴随时问:D
    【解决方案2】:

    通常,如果您要更改变量的值...最好将其放在状态中。但是,如果您将值作为参数传递,则可以在 State 对象中声明一个单独的变量,然后在 initState() 方法中对其进行初始化

    【讨论】:

    • 嗨,我用代码示例更新了它。如果这仍然不够清楚,请告诉我。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2021-12-04
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    相关资源
    最近更新 更多