Невозможно успешно вызвать startRecorder (uri: ...) из пакета flutter_sound - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь заставить работать простой функционал пакета flutter_sound. Я подхожу к этому, сначала имея возможность начать запись. Кажется, что в настоящее время у меня есть проблема, когда, даже когда я включаю Uri, куда я хочу сохранить эти файлы, а также тип аудиоформата, я хочу, чтобы он экспортировал эти файлы, когда я получаю сообщение о проблеме:

flutter: NoSuchMethodError: The method 'startRecorder' was called on null.
Receiver: null
Tried calling: startRecorder(codec: Instance of 't_CODEC', uri: "/Users/<user-name>/Library/Developer/CoreSimulator/Devices/CEC7EE26-9400-479B-85EB-06728074F7C0/data/Containers/Data/Application/4C726628-AE3B-42E7-8C6A-4B239AFDFAE6/Library/Caches/audio.aac")

Я проверил каталог и не вижу файла audio.aac, поэтому, когда я попытался создать файл через терминал с помощью touch audio.aac и попытался записать, я все еще получил ту же ошибку , Поэтому я предполагаю, что мне нужно каким-то образом создать этот файл или что я вообще не понимаю, в чем проблема. Я действительно заблудился, когда другие разработчики пытались помочь, и я не могу найти ресурсы о том, как решить эту проблему.

В моем pubspe c .yaml я установил версию flutter_sound, как показано ниже:

dev_dependencies:
  flutter_sound: ^2.0.3

Я включил необходимые разрешения в моем Info.plist и в моем AndroidManifest . xml.

Я буду публиковать, что я считаю необходимым кодом ниже.

class _AudioRecorderState extends State<AudioRecorder> {
  String _recordedFilePath;
  bool _isRecording = false;
  bool _isPlaying = false;
  StreamSubscription _recorderSubscription;
  StreamSubscription _dbPeakSubscription;
  StreamSubscription _playerSubscription;
  FlutterSound flutterSound;

  String _recorderTxt = '00:00:00';
  String _playerTxt = '00:00:00';
  double _dbLevel;

  double sliderCurrentPosition = 0.0;
  double maxDuration = 1.0;

  @override
  void initState() {
    super.initState();
    FlutterSound flutterSound = new FlutterSound();
    flutterSound.setSubscriptionDuration(0.01);
    flutterSound.setDbPeakLevelUpdate(0.8);
    flutterSound.setDbLevelEnabled(true);
    initializeDateFormatting();
  }

  void startRecorder() async {
    try {
      Directory tempDir = await getTemporaryDirectory();
      File filePath = File('${tempDir.path}/audio.aac');
      String path = await flutterSound.startRecorder(uri: filePath.path, codec: t_CODEC.CODEC_AAC);
      print('startRecorder: $path');

      _recorderSubscription = flutterSound.onRecorderStateChanged.listen((e) {
        DateTime date = new DateTime.fromMillisecondsSinceEpoch(
            e.currentPosition.toInt(),
            isUtc: true);
        String txt = DateFormat('mm:ss:SS', 'en_US').format(date);

        this.setState(() {
          this._recorderTxt = txt.substring(0, 8);
        });
      });
      _dbPeakSubscription =
          flutterSound.onRecorderDbPeakChanged.listen((value) {
        print("got update -> $value");
        setState(() {
          this._dbLevel = value;
        });
      });

      this.setState(() {
        this._isRecording = true;
      });
    } catch (err) {
      print('startRecorder error: $err');
    }
  }

Если вы хотите увидеть мой Widget Build(...){...} или любую другую часть моего кода пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 15 марта 2020

вы неправильно инициализируете свой экземпляр flutterSound

 @override
  void initState() {
    super.initState();
    //FlutterSound flutterSound = new FlutterSound();
    //you already created flutterSound at the top
    flutterSound = new FlutterSound();
    flutterSound.setSubscriptionDuration(0.01);
    flutterSound.setDbPeakLevelUpdate(0.8);
    flutterSound.setDbLevelEnabled(true);
    initializeDateFormatting();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...