当前位置: 首页 > 知识库问答 >
问题:

带NullSecurity的Flutter中的单例类

包建义
2023-03-14

我有这个类,它通过使用工厂构造函数接受一些参数,如果实例为空,将创建一个新的对象;如果不为空,将返回实例的值,因此我们总是接收相同的对象(Singleton)。这就是我在启用dart的空安全特性之前使用singleton模式的方式。

class GuestUser extends User {
  static GeustUser _instance;


  factory GuestUser(
      {required String firstName,
      required String lastName,
      required String email,
      required Address address,
      required PaymentInfo paymentInfo}) {
    if (_instance == null) {
      _instance =
          GuestUser._(firstName, lastName, email, address, paymentInfo);
    }
    return _instance;
  }

现在启用了空安全,我得到这个错误:

The non-nullable variable '_instance' must be initialized.
Try adding an initializer expression.

此外,如果不再需要 (_instance == null)。

如果我像这样定义_instancestatic late final GuestUser_instances 只能在需要时创建_instances,那么我就不能使用<code>了。因此,每次调用工厂构造函数时,我必须删除if语句并创建一个新实例。

如何解决此问题并创建启用了空安全的单例类?

我想到了用一个布尔变量来跟踪实例的解决方案:

static late final GeustUser _instance;
static bool _isInstanceCreated = false;

  factory GuestUser(
      {required String firstName,
      required String lastName,
      required String email,
      required Address address,
      required PaymentInfo paymentInfo}) {
    if (_isInstanceCreated == false) {
      _instance =
          GuestUser._(firstName, lastName, email, address, paymentInfo);
    }
    _isInsanceCreated = true;
    return _instance;
  }

但是我想知道是否有一种方法可以在不定义新变量的情况下使用空安全功能来做到这一点


共有3个答案

红甫
2023-03-14

正如@julemand101提到的,你的单例实际上很奇怪,因为通常你会做这样的事情:

class Foo {
  static final instance = Foo._();
  Foo._();
}

但是,您不能用参数实例化它。为此,您可以这样做:

class Bar {
  static Bar? instance;
  Bar._(int i);

  factory Bar.fromInt(int i) {
    var bar = Bar._(i);
    instance = bar;
    return bar;
  }

  void display() => print('Bar instance');
}

void main() {
  final nullableBar = Bar.instance;
  final nonNullableBar = Bar.fromInt(0);

  nullableBar!.display(); // Runtime error as Bar.instance is used before Bar.fromMap(0)
  nonNullableBar.display(); // No error
}
易星纬
2023-03-14

您可以使用相同的传统方式创建单一实例。您只需将零安全运算符放在正确的位置即可。

class MySingleton {
  // make this nullable by adding '?'
  static MySingleton? _instance;

  MySingleton._() {
    // initialization and stuff
  }

  factory MySingleton() {
    if (_instance == null) {
      _instance = new MySingleton._();
    }
    // since you are sure you will return non-null value, add '!' operator
    return _instance!;
  }
}
彭硕
2023-03-14
匿名用户

您的单例有点奇怪,因为您接受的参数只有在第一次调用时才会使用。这不是一个很好的模式,因为如果您想将其用于两个不同的来宾用户,它会带来一些惊喜。

在你的例子中,使用< code>GuestUser?作为< code>_instance的类型。Dart中默认不可空不应被视为使用< code>null是不好的,您应该在有意义的地方使用< code>null(特别是如果我们可以防止引入< code>bool变量来指示变量是否已被设置)。在您的示例中,< code>_instance在第一次初始化之前为空。

我们使用<code>的示例= 运算符。运算符将检查_instance是否为null,如果为null,则将变量分配给通过调用构造函数GuestUser创建的对象。_。此后,它将返回_instance的值。如果_instance已经有一个值(而不是null),则只返回该值,而不调用GuestUser_ 构造函数。

class GuestUser extends User {
  static GuestUser? _instance;

  factory GuestUser(
          {required String firstName,
          required String lastName,
          required String email,
          required Address address,
          required PaymentInfo paymentInfo}) =>
      _instance ??=
          GuestUser._(firstName, lastName, email, address, paymentInfo);
}

如果您有一个更传统的singleton,您可以在定义中创建实例的地方创建一个< code>static final变量。但是这不考虑参数。

 类似资料:
  • 我正试图将一个Android应用程序从Java转换为Kotlin。应用程序中有几个单人。我为没有构造函数参数的单例使用了一个伴生对象。还有另一个接受构造函数参数的单例。 Java代码:

  • 编译器显示下一个错误:在这里输入图像描述

  • 本文向大家介绍Flutter中ListView 的使用示例,包括了Flutter中ListView 的使用示例的使用技巧和注意事项,需要的朋友参考一下 这个小例子使用的是豆瓣 API 中 正在上映的电影 的开放接口,要实现的主要效果如下: JSON 数据结构 Item 结构 Item 的结构是一个 Card 包含着一个 Row 然后这个 Row 里面左边是一个 Image ,右边是一个 Colum

  • 我已经按照这个链接,并成功地在Android中制作了单例类。http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/ 问题是我想要一个单一的对象。与活动A和活动B类似,在活动A中,我从Singleton访问对象。我使用该对象并对其进行了一些更改。

  • 问题内容: Java API中Singleton设计模式的最佳示例是什么?是类单身? 问题答案: 我想到的只有两个例子: 另请参阅 : Java API中GoF设计模式的真实示例 更新 :要回答PeterMmm(当前已删除?)的注释(问我如何知道它是一个单例),请检查javadoc和源代码: 它每次都返回相同的实例,并且具有构造函数。

  • 我想在不导入材料主题的情况下将提示文本添加到。到目前为止,我尝试将与混合,如下所示: 这将导致以下错误: