我正在努力学习dart 和Flutter Flutter 的语言.我看到了以下代码段(摘自此处:https://github.com/ppicas/flutter-android-background/blob/master/lib/counter_service.dart):

import 'package:flutter/foundation.dart';

import 'counter.dart';

class CounterService {
  factory CounterService.instance() => _instance;

  CounterService._internal(); <<====================== Why is this line here ? What does it do?

  static final _instance = CounterService._internal();

  final _counter = Counter();

  ValueListenable<int> get count => _counter.count;

  void startCounting() {
    Stream.periodic(Duration(seconds: 1)).listen((_) {
      _counter.increment();
      print('Counter incremented: ${_counter.count.value}');
    });
  }
}

我弄不明白为什么那里需要这行代码.我知道我们通过实现私有构造函数来强制返回这个类的单个实例,而唯一的实例是在下面一行中创建的.那么,为什么我们真的要在那里有这条线呢?

如果dart 专家能给我解释一下,我将不胜感激.谢谢

推荐答案

CounterService._internal();

private named constructor that creates an object and can be called only within the class(隐私).

factory CounterService.instance() => _instance;

public named constructor that returns an object(CounterService object)and can be called outside the class.

现在的问题是:

该类的客户端如何创建对象?

回答:他只需拨打CounterService.instance()-which always return an object we have already instantiated from the internal private constructor.记住!

static final _instance = CounterService._internal();

_实例is a private object of the same type of its class,它是composition

注意:它是使用私有构造函数创建的,而公共构造函数总是返回它. 那么,上面代码的目的是什么呢?

它的目标是只返回该类中的一个对象,它是conformation to Singleton Design Pattern.

希望能对你有所帮助.

Flutter相关问答推荐

类型flatter doctor get zsh:未找到命令:macO中flatter

Flutter -如何将导航轨道标签靠左对齐?

BlocBuilder仅生成一次,并在后续发出时停止重建

Flutter 文件拾取器Android SingleInstance模式它返回的文件路径为空

将侧边菜单和底部导航栏放在同一Flutter 应用程序中

应为Map String,dynamic类型的值,但得到的值为type()= Map String,dynamic'

为什么用户界面不会在Flight中的复选框中更改?

dart /长笛中的返回早期模式和拆分方法

当 Dart SDK 版本范围不匹配时,为什么依赖解析器不会抛出错误?

创建混合 TextWidget 和 TextFieldWidget

在参数为空时保持命名参数的默认值

splash_screen 没有被推送到登录页面

从所有设备注销,因为用户帐户已从 firebase flutter 中删除

在向 Google Route API 发送 HTTP Post 请求期间发生错误,

如何扫描来自给定链接或按钮的重定向中的所有 URL?

出现错误;运算符[]不是为对象类型定义的?功能()'

如何在 tabBar 中的选项卡之间制作垂直线?

扫描flutter生成的二维码后如何弹出文本字段值

运行Flutter 测试时出现 FirebaseAppPlatform.verifyExtends 错误

Flutter .replaceFirst(或全部)不起作用