Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何创建不可修改的类颤振_Flutter_Oop_Object_Dart - Fatal编程技术网

Flutter 如何创建不可修改的类颤振

Flutter 如何创建不可修改的类颤振,flutter,oop,object,dart,Flutter,Oop,Object,Dart,我需要创建一个名为GeneralAppAndDeviceDetails的类,该类具有以下字段: import 'package:flutter/material.dart'; class GeneralAppAndDeviceDetails { final bool isDarkModeEnabled; final double deviceWidth; final double deviceHeight; final Color primaryColor; final C

我需要创建一个名为
GeneralAppAndDeviceDetails
的类,该类具有以下字段:

import 'package:flutter/material.dart';

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

它基本上在程序开始时存储一般的设备和应用程序信息,这样每当我想访问这些详细信息时,就不需要创建
Theme
MediaQuery
类的新实例

我面临的问题是,如何编写这个类,以便在字段的值被赋值后,它们将是不可修改的?(以便任何内容都不能更改字段值)

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

我需要的是有一个静态字段,它可以一次接收一个值,之后就不可修改了。我怎样才能实现类似的目标

多谢各位

更新:

我写的课程如下:

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);
}



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

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

可以将该类设置为singleton,然后将这些字段设置为private,只能通过getter和setter访问,在setter中,如果已经有一些值分配给字段,您可以检查并放弃新值。

这是您的singleton类

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
    );
  }
  
}

试着运行这个以便更好地理解

这是你的单例类

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
    );
  }
  
}

试着运行这个以更好地理解

我更新了这个问题。请让我知道您的想法。看起来不错,一旦创建,它将始终返回相同的实例,并且值只能在我第一次更新问题时修改。请让我知道您的想法。看起来不错,一旦创建,它将始终返回同一个实例,并且值只能在第一次修改。您可以准确指定什么应该是不可修改的以及何时修改。类的每个实例是否应该使用可能不同的值构造,但字段值不应该在构造->构造函数和最终字段值之后更改。这个类应该只有一个实例->单例。当字段被分配时,是否有不同的时间点,但它们应该是最终的->我想你需要布尔函数来跟踪单个字段或类似的解决方案。我需要在整个应用程序中访问字段数据,所以我决定创建一个类,而不是创建全局变量。这些字段值在收到值后不应更改(例如deviceWidth无法更改)。因此,我需要使类字段不可修改。我不想在整个应用程序中创建不同的实例,所以我需要像singleton这样的东西,而接受的答案正是我所需要的。你可以确切地指定什么是不可修改的,什么时候可以。类的每个实例是否应该使用可能不同的值构造,但字段值不应该在构造->构造函数和最终字段值之后更改。这个类应该只有一个实例->单例。当字段被分配时,是否有不同的时间点,但它们应该是最终的->我想你需要布尔函数来跟踪单个字段或类似的解决方案。我需要在整个应用程序中访问字段数据,所以我决定创建一个类,而不是创建全局变量。这些字段值在收到值后不应更改(例如deviceWidth无法更改)。因此,我需要使类字段不可修改。我不想在整个应用程序中创建不同的实例,所以我需要像singleton这样的东西,而接受的答案正是我需要的