Функция виджета не работает в виджете столбца?

Я создаю приложение MusicPlayer, поэтому мне нужно просмотреть список musicTiles, чтобы пользователь мог выбрать песню из внутреннего хранилища и воспроизвести ее. Поэтому я использовал File_Picker на панели приложений с помощью кнопки добавления, с помощью которой пользователь может забирать музыку из своего локального хранилища. Поэтому я использовал ключевые слова async и await в своей функции file_picking. и я сохраняю file_path и file_names в типе переменных List. После этого я использовал функцию _buidMusicTile () в моем виджете столбца, но она дает следующую ошибку:

= › тип" Future "не является подтипом типа" Widget "

Код:

class _MusicPageState extends State<MusicPage> {
  
  FileType _pickingType = FileType.any;
  TextEditingController _controller = TextEditingController();
  List<String> listofAudioFilesPath;
  List<String> listofAudioNames;

  @override
  void initState() {
    super.initState();
    _controller.addListener(() => _extension = _controller.text);
  }
  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    //const Key centerKey = ValueKey('bottom-sliver-list');
    return Scaffold(
      backgroundColor: Colors.brown[300],
      appBar: AppBar(
        actions: [
          Container(
            width: size.width,
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  IconButton(
                    icon: Icon(Icons.sort),
                    onPressed: () {},
                  ),
                  IconButton(
                    icon: Icon(Icons.add_circle),
                    onPressed: () async {
                      // _openFileExplorer();
                      FilePickerResult result = await FilePicker.platform
                          .pickFiles(allowMultiple: true);
                      if (result != null) {
                        listofAudioFilesPath = result.paths.toList();

                        listofAudioNames = result.names.toList();

                        print(listofAudioNames);
                        print(listofAudioFilesPath);
                      }
                    },
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
      body: Column(
        children: [
          Text('Music Library'),
          SizedBox(height: 10),
          Stack(
            children: [
              _buildMusicTile(listofAudioFilesPath, listofAudioNames),
            ],
          ),
        ],
      ),
    );
  }
}

_buildMusicTile(
    List<String> listofAudioFilesPath, List<String> listofAudioNames) async {
  List<String> listOfPath = await listofAudioFilesPath;
  List<String> listOfFiles = await listofAudioFilesPath;
  if (listofAudioFilesPath != null && listofAudioNames != null) {
    return ListView.separated(
      itemCount: listofAudioNames.length,
      separatorBuilder: (BuildContext context, int index) {
        return Container(
          height: 10,
          color: Colors.white,
        );
      },
      itemBuilder: (BuildContext context, int index) {
        return ListTile(
          leading: Icon(Icons.play_circle_filled),
          title: Text(
            '$listofAudioNames[$index]',
            style: TextStyle(color: Colors.black, fontSize: 25),
          ),
        );
      },
    );
  } else {
    return Center(
      child: Column(
        children: [
          Text(
            '$listofAudioNames',
            style: TextStyle(color: Colors.black, fontSize: 25),
          ),
          CircularProgressIndicator(),
        ],
      ),
    );
  }
}

person user11908262    schedule 30.09.2020    source источник
comment
попробуйте использовать FutureBuilder   -  person Sajith    schedule 30.09.2020


Ответы (1)


Вы не можете использовать await внутри тела или метода, который вызывается из тела, потому что это нужно отображать на экране, пользовательский интерфейс не может ждать каких-либо данных, нам нужно их обновить.

Решение:

Просто удалите await и async из метода _buildMusicTile, например

  List<String> listOfPath = listofAudioFilesPath;
  List<String> listOfFiles = listofAudioFilesPath;

И добавьте setState() внутрь onPressed()

setState(() {
        print(listofAudioNames);
        print(listofAudioFilesPath);
  });
person Jitesh Mohite    schedule 30.09.2020
comment
Брат. По-прежнему выдает ту же ошибку: при построении MudicPage возникла следующая ошибка _TypeError (грязная, зависимости: [MediaQuery], состояние: _MusicPageState # 1cfac): тип 'Future ‹dynamic›' не является подтипом типа 'Widget' < / b> - person user11908262; 30.09.2020
comment
Также удалите ключевое слово async из _buildMusicTile () - person Jitesh Mohite; 30.09.2020
comment
Спасибо брату за помощь. - person user11908262; 30.09.2020