【问题标题】:Constructor method called twice when using top-level variable使用顶级变量时调用了两次构造函数方法
【发布时间】:2021-03-31 23:55:36
【问题描述】:

我是 dart 语法的新手。

我正在尝试使用顶级变量。

但我在AudioPlayerTask 类中遇到问题// STEP 3 : THIS CONSTRUCTOR CALLED TWICE AudioPlayerTask()

发生在return audioPlayerTask; // STEP 2 : WHEN RETURN THIS VALUE

我不知道。

知道的人,

请告诉我如何避免它被调用两次。 (我希望它调用一次。)

谢谢,

AudioPlayerPage.dart

// top-level variable
// STEP 1 : CONSTRUCTOR MEDTHOD CALL FIRST TIME
final AudioPlayerTask audioPlayerTask = AudioPlayerTask();

AudioPlayerTask.dart

class AudioPlayerTask extends BackgroundAudioTask {
  
  // STEP 3 : THIS CONSTRUCTOR CALLED TWICE.
  AudioPlayerTask() {
    print('AudioPlayerTask() : Constructor()');
  }
}

AudioPlayerBloc.dart

class AudioPlayerBloc {

/*
* Feature : Start background service to play and show notification
* */
Future startService() async {
  if (!AudioService.connected) {
    await AudioService.connect();

    print('AudioService.start()');

    await AudioService.start(
      backgroundTaskEntrypoint: audioPlayerTaskEntryPoint,
      androidNotificationChannelName: 'Nhaccuatui',
      androidNotificationColor: 0x00AEEF,
      androidNotificationIcon: 'mipmap/ic_launcher',
    );
  }
}

// top-level function.
void audioPlayerTaskEntryPoint() async {
  print('AudioServiceBackground.run() :');

  AudioServiceBackground.run(() {
    return audioPlayerTask; // STEP 2 : WHEN RETURN THIS VALUE, IT MAKES THE CONSTRUCTOR CALL AGAIN
  });
}


}

pubspec.yaml

name: flutter
description: Flutter
version: 1.0.0+1

environment:
  sdk: ">=2.9.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  audio_service: ^0.15.3
  cupertino_icons: ^1.0.0
  rxdart: ^0.24.1

dev_dependencies:
  flutter_test:
    sdk: flutter

  build_runner: ^1.10.4

flutter:
  uses-material-design: true

更新 遵循@dm_tr 的建议,它可以作为全局变量访问,但它的值(audioPlayerTask )总是为空。我错过了什么?

ma​​in.dart

AudioPlayerTask audioPlayerTask;

void main() {
  // If you're running an application and need to access the binary messenger 
  // before `runApp()` has been called (for example, during plugin initialization),
  // then you need to explicitly call the `WidgetsFlutterBinding.ensureInitialized()` first.
  WidgetsFlutterBinding.ensureInitialized();

  audioPlayerTask = AudioPlayerTask();

  runApp(App());
}

// top-level function.
void audioPlayerTaskEntryPoint() async {
  print(
      'audioPlayerTask = $audioPlayerTask'  // THIS VALUE IS NULL
  );

  if (audioPlayerTask != null) {
    print('AudioServiceBackground.run() :');
    
    AudioServiceBackground.run(() => audioPlayerTask);
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    你不需要在 dart 中创建empty constructor(默认构造函数)。只需声明类,您就可以在任何地方创建它的实例

    【讨论】:

    • 如果我想将此变量用作全局变量? final AudioPlayerTask audioPlayerTask = AudioPlayerTask();我怎样才能保留这个?
    • void main()之前声明main.dart文件中的变量像这样AudioPlayerTask audioPlayerTask,并在main方法audioPlayerTask = AudioPlayerTask();中初始化。这样,它就被视为全局变量,可以在项目的每个页面中访问
    • 我已经申请了,但它的值在方法audioPlayerTaskEntryPoint 中总是为空。您可以查看我更新的问题以获取更多详细信息?
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多