_CastError (оператор проверки Null, используемый для нулевого значения) при попытке воспроизвести песню

#flutter #dart

Вопрос:

Я столкнулся с _кастеррором и не могу его исправить. Если кто-нибудь сможет исправить существующий код и прикрепить его, мы будем очень признательны. Я использовал это ! оператор и я думаю, что это главная причина этой проблемы. Я не знаю, как справиться с этой проблемой . Исправленный код и прикрепленный будет очень признателен, вот мой код: я также прикрепляю скриншот ошибки, поэтому, пожалуйста, посмотрите.

_КастЕррор скриншот

 import 'package:ai_music_player/model/radio.dart'; import 'package:ai_music_player/utils/ai_utils.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:velocity_x/velocity_x.dart';  class HomePage extends StatefulWidget {  const HomePage({Key? key}) : super(key: key);   @override  _HomePageState createState() =gt; _HomePageState(); }  class _HomePageState extends Statelt;HomePagegt; {  Listlt;MyRadiogt;? radios;  MyRadio? _selectedRadio;  Color? _selectedColor;  bool _isPlaying = false;   final AudioPlayer _audioPlayer = AudioPlayer();   @override  void initState() {  super.initState();  fetchRadios();  _audioPlayer.onPlayerStateChanged.listen((event) {  if (event == PlayerState.PLAYING) {  _isPlaying = true;  } else {  _isPlaying = false;  }  setState(() {});  });  }   fetchRadios() async {  final radioJson = await rootBundle.loadString("assets/radio.json");  radios = MyRadioList.fromJson(radioJson).radios;  setState(() {});  }   playMusic(String url) {  _audioPlayer.play(url);  _selectedRadio = radios!.firstWhere((element) =gt; element.url == url);  print(_selectedRadio!.name);  setState(() {});  }   @override  Widget build(BuildContext context) {  return Scaffold(  drawer: Drawer(),  body: Stack(  children: [  VxAnimatedBox()  .size(context.screenWidth, context.screenHeight)  .withGradient(  LinearGradient(  colors: [AIColors.primaryColor1, AIColors.primaryColor2],  begin: Alignment.topLeft,  end: Alignment.bottomRight),  )  .make(),  AppBar(  title: "AI Player".text.xl4.bold.white.make().shimmer(  primaryColor: Vx.purple300, secondaryColor: Colors.white),  backgroundColor: Colors.transparent,  elevation: 0.0,  centerTitle: true,  ).h(120),  radios != null  ? VxSwiper.builder(  itemCount: radios!.length,  enlargeCenterPage: true,  itemBuilder: (context, index) {  final rad = radios![index];  return VxBox(  child: ZStack(  [  Positioned(  top: 0,  right: 0,  child: VxBox(  child: rad.lang.text.uppercase.bold.white  .make()  .px16(),  )  .height(40)  .black  .alignCenter  .withRounded(value: 10)  .make(),  ),  Align(  alignment: Alignment.bottomCenter,  child: VStack(  [  rad.name.text.xl5.white.bold.make(),  5.heightBox,  rad.tagline.text.xl.white.bold.italic.make(),  ],  crossAlignment: CrossAxisAlignment.center,  ),  ),  Align(  alignment: Alignment.center,  child: [  const Icon(  CupertinoIcons.play_circle,  color: Colors.white54,  size: 60,  ),  10.heightBox,  "DOUBLE TAB TO PLAY".text.gray300.make()  ].vStack(),  ),  ],  ),  )  .clip(Clip.antiAlias)  .bgImage(  DecorationImage(  image: NetworkImage(rad.image),  fit: BoxFit.cover,  colorFilter: ColorFilter.mode(  Colors.black.withOpacity(0.3),  BlendMode.darken),  ),  )  .border(color: Colors.black, width: 3)  .withRounded(value: 60.0)  .make()  .onInkDoubleTap(() {  _audioPlayer.play(rad.url);  });  },  aspectRatio: 1.0,  ).centered()  : const Center(  child: CircularProgressIndicator(  color: Colors.white,  ),  ),  Align(  alignment: Alignment.bottomCenter,  child: [  if (_isPlaying)  "Playing - ${_selectedRadio!.name} FM".text.makeCentered(),  Icon(  _isPlaying  ? CupertinoIcons.stop_circle  : CupertinoIcons.play_circle,  color: Colors.white,  size: 60,  ).onInkTap(() {  if (_isPlaying) {  _audioPlayer.stop();  } else {  _audioPlayer.play(_selectedRadio!.url);  }  })  ].vStack(),  ).pOnly(bottom: context.percentHeight * 12)  ],  fit: StackFit.expand,  ),  );  } }  

Ответ №1:

Вы хотите, чтобы я просто дал вам исправленный код, к сожалению, это не так просто, я не знаю, как исправить код, потому что я не знаю, чего вы хотите, однако я могу дать вам рекомендации и объяснить плюсы и минусы таких рекомендаций:

 _audioPlayer.play(_selectedRadio!.url);  

Тот факт, что вы получаете ошибку в этой строке, означает, что _selectedRadio она равна нулю, а это значит, что url это не так.

Прочитав ваш код, я заметил, что вы назначаете только _selectedRadio playMusic метод e, но я не вижу, чтобы вы когда-либо вызывали этот метод, поэтому у вас есть три варианта:

Во-первых, вы можете присвоить значение по умолчанию _selectedRadio , чтобы оно никогда не было null

От:

 MyRadio? _selectedRadio;  

Для:

 MyRadio _selectedRadio = MyRadio(); // I don't know how you initialize this  

Второй: Вы можете проверить, является ли _selectedRadio значение `null

От:

 } else {  _audioPlayer.play(_selectedRadio!.url); }  

Для;

 } else {  if (_selectedRadio != null) {  _audioPlayer.play(_selectedRadio!.url);  } }  

Наконец, вы могли бы предоставить некоторое запасное значение для воспроизведения, если _selectedRadio это null

От:

 _audioPlayer.play(_selectedRadio!.url);  

Для:

 _audioPlayer.play(_selectedRadio?.url ?? 'some other url');  

Ваше решение зависит от того, что вы хотите, чтобы ваше приложение выполняло.

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

1. Большое спасибо. Я действительно ценю ваше решение

2. Я рад, что это помогло вам!