flutter :: Необработанное исключение: исключение PlatformException(неожиданная ошибка!, uriString, java.lang.Исключение NullPointerException: исключение uriString

#flutter #dart

#флаттер #dart

Вопрос:

     import 'package:audioplayers/audioplayers.dart';
    import 'package:path_provider/path_provider.dart';
    import 'dart:io';
    import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
    
    
    class AudioViewer extends StatefulWidget {
      @override
      _AudioViewerState createState() => _AudioViewerState();
    }
    
    class _AudioViewerState extends State<AudioViewer> {
      List file = [];
      var audioPath;
      var directory;
      late AudioPlayer audioPlayer;
      bool _isplaying = false;
      var _icon = Icons.play_arrow;
      var _deleteicon = Icons.delete;
      Color _color = Colors.deepOrangeAccent;
      Duration position = Duration();
      Duration duration = Duration(seconds: 1);
    
      int indexindex = 0;
    
      @override
      void initState() {
        super.initState();
        getFiles();
        _setupAudioPlayer();
      }
    
      void getFiles() async {
        directory = (await getExternalStorageDirectory())!.path;
        setState(() {
          file = Directory("$directory").listSync();
        });
        print(file.toString());
      }
    
      @override
      Widget build(BuildContext context) {
        var height = MediaQuery.of(context).size.height;
        var width = MediaQuery.of(context).size.width;
        return Scaffold(
          appBar: AppBar(
            elevation: 0,
            title: Text(
              "Audio List",
            ),
          ),
          body: Container(
              child: ListView.builder(
                reverse: true,
                itemCount: file.length,
                itemBuilder: (BuildContext context, int index) {
                return Card(
                    elevation: 5,
                    child: ExpansionTile(
                        title: Text(
                          'Record ${index}',
                          style: TextStyle(color: Colors.black),
                        ),
                        onExpansionChanged: ((newState) {
                          if (newState) {
                            indexindex = index;
                            setState(() {
                            });
                          }
                        }),
                        children: [
                          Container(
                            height: 100,
                            padding: EdgeInsets.fromLTRB(10,0,10,0),
                            child: Column(
                              children: <Widget>[
                                Container(
                                    child: Row(
                                        children: <Widget>[
                                          Container(
                                            child: IconButton(
                                              iconSize: 40,
                                              onPressed: () {
                                                if (!_isplaying) {
                                                  _play();
                                                } else {
                                                  _stop();
                                                }
                                              },
                                              icon: Icon(_icon),
                                              color: _color,
                                            ),
                                          ),
                                          Container(
                                            child: IconButton(
                                              iconSize: 30,
                                              onPressed: () {
                                                file[index].delete(recursive: true);
                                                setState(() {
                                                  file.removeAt(index);
                                                  position = new Duration();
                                                });
                                              },
                                              icon: Icon(_deleteicon),
                                            ),
                                          ),
                                        ]
                                    )
                                ),
    
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: LinearProgressIndicator(
                                    backgroundColor: Colors.grey[300],
                                    valueColor: AlwaysStoppedAnimation(Colors.deepOrangeAccent),
                                    value: (position.inMilliseconds / duration.inMilliseconds) * 1.0,
                                  ),
                                ),
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                    children: <Widget>[
                                      Text(
                                        _getDuration(position),
                                        style: TextStyle(color: Colors.black),
                                      ),
                                      Text(
                                        _getDuration(duration),
                                        style: TextStyle(color: Colors.black),
                                      )
                                    ],
                                  ),
                                )
                              ],
                            ),
                          )
                        ]
                    )
                );
                },
              ),
          ),
        );
      }
    
      String _getDuration(Duration duration) {
        String twoDigits(int n) {
          if (n >= 10) return "$n";
          return "0$n";
        }
    
        String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
        String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
        return "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
      }
    
      _play() {
        audioPlayer.resume();
        setState(() {
          _isplaying = true;
          _icon = Icons.pause;
          _color = Colors.blueGrey;
        });
      }
    
      _stop() {
        audioPlayer.release();
        setState(() {
          position = new Duration();
          _isplaying = false;
          _icon = Icons.play_arrow;
          _color = Colors.deepOrangeAccent;
        });
      }
    
      _stateListener(PlayerState state) {
        print(" In _stateListener  the state of AudioPlayer :- "  
            state.toString()  
            "n");
        if (state == PlayerState.COMPLETED) {
          //Navigator.pop(context);
          _stop();
        }
      }
    
      _setupAudioPlayer() async {
        position = new Duration(seconds: 0);
        audioPlayer = AudioPlayer();
        await audioPlayer.setUrl(file[indexindex].path.toString());
        await audioPlayer.setReleaseMode(ReleaseMode.STOP);
    
        audioPlayer.onAudioPositionChanged.listen((Duration p) {
          print('Current position: $p');
          setState(() => position = p);
        });
    
        audioPlayer.onDurationChanged.listen((Duration d) {
          print('Max duration: $d');
          setState(() => duration = d);
        });
        audioPlayer.onPlayerStateChanged.listen(_stateListener);
      }
    
    
    
    }
 

Я создал функцию для записи голоса и воспроизведения / удаления записанных файлов. Я использовал пакет audioplayers для создания функции для воспроизведения файлов записи.
Кнопка удаления работает нормально. Но когда я нажимаю кнопку воспроизведения, записанный файл не воспроизводится, и возникает следующая ошибка.

E/flutter (17278): [ОШИБКА: flutter/lib/ui/ui_dart_state.cc(209)] Необработанное исключение: исключение PlatformException(неожиданная ошибка!, uriString, java.lang.Исключение NullPointerException: исключение uriString

Как я могу это решить?

Комментарии:

1. Вы объявили audioPlayer as late , но вы создаете его в асинхронной функции _setupAudioPlayer . Играя с огнем, нет никакой гарантии, что он будет инициализирован к моменту его использования. Я бы предпочел сделать его обнуляемым и проверять наличие null при каждом использовании… таким образом, вы можете пропустить попытки использовать его, пока он не инициализирован.

2. Я удалил поздно и выполнил нулевую проверку, но та же ошибка все еще возникает.

3. Не видя полной трассировки стека, я не уверен, откуда это происходит, но это явно ошибка библиотеки Java … я предполагаю, что она исходит из пакета player, попробуйте заполнить проблему с ними: github.com/bluefireteam/audioplayers/issues