【问题标题】:How can I create a non-modifiable class Flutter如何创建不可修改的类 Flutter
【发布时间】:2020-11-20 18:05:52
【问题描述】:

我需要创建一个名为 GeneralAppAndDeviceDetails 的类,其中包含以下字段:

import 'package:flutter/material.dart';

class GeneralAppAndDeviceDetails {
  final bool isDarkModeEnabled;
  final double deviceWidth;
  final double deviceHeight;
  final Color primaryColor;
  final Color secondaryColor;
}

它基本上在程序开始时存储通用设备和应用程序信息,因此我无需在我想访问这些详细信息时创建ThemeMediaQuery 类的新实例。

我面临的问题是如何编写此类,以便在分配字段的值后,它们将不可修改? (这样就不会改变字段值)

(我尝试创建一个单例类,但我需要将值传递给构造函数,并且通过使用工厂和私有构造函数,用户可以创建具有传递给工厂的不同参数的新类。)

我需要的是静态字段可以接收一次值,然后变得不可修改。我怎样才能实现类似的目标?

谢谢

更新:

我写的类如下:

import 'package:flutter/material.dart';

class GeneralAppAndDeviceDetails {
  final bool isDarkModeEnabled;
  final double deviceWidth;
  final double deviceHeight;
  final Color primaryColor;
  final Color secondaryColor;
  static bool _isAlreadyCreated = false;
  static GeneralAppAndDeviceDetails _instance;

  factory GeneralAppAndDeviceDetails(bool isDarkModeEnabled, double deviceWidth,
      double deviceHeight, Color primaryColor, Color secondaryColor) {
    if (_isAlreadyCreated == false) {
      _isAlreadyCreated = true;
      _instance = GeneralAppAndDeviceDetails._(isDarkModeEnabled, deviceWidth,
          deviceHeight, primaryColor, secondaryColor);
    }
    return _instance;
  }
  const GeneralAppAndDeviceDetails._(this.isDarkModeEnabled, this.deviceWidth,
      this.deviceHeight, this.primaryColor, this.secondaryColor);
}


我使用一个标志来检查之前是否在此处创建了一个实例,并且使用此代码,每次都会返回一个类似的实例,但这是实现此目的的最佳方法吗?

【问题讨论】:

  • 您能否准确指定哪些内容不可修改以及何时不可修改。是否应该使用可能不同的值构造类的每个实例,但在构造后字段值不应更改->具有最终字段值的构造函数。应该只有这个类的1个实例->单例。分配字段时是否存在不同的时间点,但它们应该是最终的->我想您需要布尔值来跟踪各个字段或类似的解决方案。
  • 我需要访问整个应用程序中的字段数据,因此我决定创建一个类,而不是创建全局变量。这些字段值在收到值后不应更改(例如,因为 deviceWidth 无法更改)。出于这个原因,我需要使类字段不可修改。我不想在整个应用程序中创建不同的实例,所以我需要像单例这样的东西,而接受的答案正是我所需要的

标签: flutter oop object dart


【解决方案1】:

这是你的单例类

class Test{
  
  final String str;
  
  static Test _singleton;
  Test._internal({this.str});
  factory Test(String str) {
    return _singleton ??= Test._internal(
    str: str
    );
  }
  
}

供您尝试和测试的示例代码

void main() {
  Test obj = Test('ABC');
  print(obj.str);
  Test obj1 = Test('XYZ');
  print(obj1.str);
}

class Test{
  
  final String str;
  
  static Test _singleton;
  Test._internal({this.str});
  factory Test(String str) {
    return _singleton ??= Test._internal(
    str: str
    );
  }
  
}

尝试在dartpad 中运行它以更好地理解

【讨论】:

    【解决方案2】:

    您可以将类设为单例,然后将这些字段设为私有,只能通过 getter 和 setter 访问,在 setter 内部,如果已经为该字段分配了一些值,您可以检查并丢弃新值。

    【讨论】:

    • 我更新了问题。请让我知道你的想法。
    • 看起来不错,一旦创建它总是返回相同的实例,并且值只能在第一次修改
    猜你喜欢
    • 2016-04-20
    • 2015-06-15
    • 2018-12-09
    • 2020-06-20
    • 2020-04-21
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多