【发布时间】: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 )总是为空。我错过了什么?
main.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);
}
}
【问题讨论】: