#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. Я рад, что это помогло вам!