【问题标题】:Flutter 'value >= min && value <= max': is not trueFlutter 'value >= min && value <= max': 不正确
【发布时间】:2021-02-15 15:08:16
【问题描述】:

我正在构建一个简单的音乐播放器类型的应用程序。当我的音频完成显示时间时,我遇到了问题

'package:flutter/src/material/slider.dart': Failed assertion: line 166 pos 15: 'value &gt;= min &amp;&amp; value &lt;= max': is not true.

我的代码

                     Expanded(
                        child: Slider(
                          activeColor: Color(0xffe7ad29),
                          inactiveColor: Color(0xFF707070),
                          value: model.playerBarValue,
                          onChanged: (val) {
                            model.seekFromBar(val);
                          },
                        ),
                      ),

class PlayerProvider extends ChangeNotifier {
  final player = AssetsAudioPlayer();
  String link;
  Duration playerTimeNow = Duration(seconds: 0);
  Duration playerLength;
  double playerBarValue = 0.0;
  Episode episode;
  Item podcastInfo;

  String episodeName, episodeThumbnail;

  bool isPlaying = false;

  PlayerProvider() {
    updateState();
  }

  play() async {
    print("Started Playing");
    // Stop previous playing
    player.stop();
    playerTimeNow = Duration(seconds: 0);
    isPlaying = false;

    // link = updateLinkToHttps(link);
    print(link);
    final audio = Audio.network(
      link,
      metas: Metas(
        title: podcastInfo.collectionName,
        artist: podcastInfo.artistName,
        album: podcastInfo.trackName,
        image: MetasImage.network(podcastInfo.artworkUrl600),
        //can be MetasImage.network
      ),
    );

    var duration = await player.open(
      audio,
      showNotification: true,
      notificationSettings: NotificationSettings(
          //seekBarEnabled: false,
          //stopEnabled: true,
          //customStopAction: (player){
          //  player.stop();
          //}
          //prevEnabled: false,
          customNextAction: (player) {
        print("next1");
        forward();
      }, customPrevAction: (player) {
        print("next2");
        backword();
      }
          //customStopIcon: AndroidResDrawable(name: "ic_stop_custom"),
          //customPauseIcon: AndroidResDrawable(name:"ic_pause_custom"),
          //customPlayIcon: AndroidResDrawable(name:"ic_play_custom"),
          ),
    );
    isPlaying = true;

    // player.play(); // Usually you don't want to wait for playback to finish.
    print("started");
    setState();
  }

  pause() async {
    await player.pause();
    isPlaying = false;
    print("paused");
    setState();
  }

  resume() async {
    //TODO: Setup resume
    await player.seek(playerTimeNow);
    player.play();
    isPlaying = true;
  }

  speed(double val) async {
    print(val);
    //TODO: Setup resume
    await player.setPlaySpeed(val);
    isPlaying = true;
  }

  updateState() {
    player.currentPosition.listen((event) {
      playerTimeNow = event;
      updatePlayerBar();
    });
  }

  updatePlayerBar() {
    int totalLengthInMilliSeconds = playerLength.inMilliseconds;
    int totalPlayedInMilliSeconds = playerTimeNow.inMilliseconds;
    double newPlayerBarValue =
        totalPlayedInMilliSeconds / totalLengthInMilliSeconds;
    playerBarValue = newPlayerBarValue;
    // print(playerBarValue);
    // print(playerTimeNow);
    // print(playerLength);
    // print(playerLength);
    // if (playerLength == playerTimeNow) {
    //   print('Finish');
    //   player.stop();
    // }

    notifyListeners();
  }

  forward() async {
    //TODO: Check if at-least 10 seconds are left;
    if (playerTimeNow + Duration(seconds: 10) < playerLength)
      await player.seek(playerTimeNow + Duration(seconds: 10));
    else
      await player.seek(playerLength);
    print("Forwarded 10 seconds");
  }

  backword() async {
    Duration back = playerTimeNow.inSeconds > 10
        ? playerTimeNow - Duration(seconds: 10)
        : Duration(seconds: 0);
    await player.seek(back);
    print("Backwarded 10 seconds");
  }

  seekFromBar(double val) async {
    double totalMillis = playerLength.inMilliseconds * val;
    int newMillis = totalMillis.toInt();
    Duration newSeekLocations = Duration(milliseconds: newMillis);
    await player.seek(newSeekLocations);
    print("Seek from Bar");
  }

  setState() {
    notifyListeners();
  }
}

当播放器时间结束时,它会在红屏上显示此错误。我需要知道这个问题的解决方法吗?意思是当它完成的时候去0或什么的。我认为问题出在滑块上,因为如果我从红屏返回,那么我的滑块会变为零。

【问题讨论】:

  • this GitHub issue 中的任何解决方案是否适合您?
  • 首先您需要确保您提供给滑块的值应该在 0 到 1 之间。然后如果该值超过 1,您可以在 onChanged 函数中添加一个处理程序将其重置为 0什么的。
  • 你可以使用api.flutter.dev/flutter/dart-core/num/clamp.html来钳制它:value.clamp(0.0, 1.0)
  • 您应该使用调试器或修改flutter/packages/flutter/lib/src/material/slider.dart 并临时修改assert 以打印valueminmax 的值来开始调试。跨度>

标签: flutter dart


【解决方案1】:

检查model.playerBarValue的值既不是Nan也不是null,并为滑块设置一个最大值。

Slider(
      value: model.playerBarValue.isNaN==true || model.playerBarValue==null? 0 : model.playerBarValue,
      min: 0.0,
      max: duration.inSeconds.toDouble() + 1.0,
      onChanged: (value) {
       . . .
      },
)

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2012-06-26
    • 1970-01-01
    • 2010-11-01
    • 2021-01-27
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多