【问题标题】:The getter 'length' was called on null flutter?吸气剂“长度”被称为空颤?
【发布时间】:2021-06-22 23:12:58
【问题描述】:

你好,任何人都知道如何在从 api 加载数据之前处理空异常我有一个应用程序,它在加载之前从 api 加载数据显示给我。这个错误

The getter 'length' was called on null.
Receiver: null
Tried calling: length

当加载数据时,错误将消失请帮助我在未加载数据之前如何使用进度条栏我试图从 api 获取数据当 api 获取数据时它在 List userdata 变量中传递数据并调用小部件 webview 问题是在加载它之前显示长度'在加载它工作正常后被调用为 null 请检查我的代码并帮助我

这是我的代码

import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

import 'package:youtube_player_flutter/youtube_player_flutter.dart';

class Media extends StatefulWidget {
  @override
  _MediaState createState() => _MediaState();
}

class _MediaState extends State<Media> {

  void initState() {
getData();
    super.initState();
  }
  bool _loading=true;
  Map data;
  List userData=null;
  Future getData() async {
    http.Response response = await http.get("https://livinghopemobile.com/public/api/fetch-livetv?token=123ab_@_@AbCD");
    data = json.decode(response.body);
    debugPrint(response.body);
    setState(() {
      userData = data["data"];
      _loading=false;
     // print(userData[0]['title']);
    });

  }


  @override
  Widget build(BuildContext context) {


    return Mediaplayer();



  }
  Mediaplayer() {
    final Completer<WebViewController> _controller = Completer<WebViewController>();
    var url =userData[0]['link'];

    String externalurl = '''
<!doctype html>
<html>
<head>
<link href="https://vjs.zencdn.net/7.10.2/video-js.css" rel="stylesheet" />

  <!-- If you'd like to support IE8 (for Video.js versions prior to v7) -->

</head>

<body>
<center>
 <video
    id="my-video"
    class="video-js vjs-big-play-centered"
    controls
    preload="auto"
    width="1000"
    height="400"
    poster="http://lhtvapp.com/click.png"
    data-setup="{}"
  >
    <source src="$url" type="application/x-mpegURL"/>

    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a
      web browser that
      <a href="https://videojs.com/html5-video-support/" target="_blank"
        >supports HTML5 video</a
      >
    </p>
  </video>
  </center>

<script src="https://vjs.zencdn.net/7.10.2/video.min.js"></script>
</body>


</body>
</html
''';


    if (url.contains('.mp4')||url.contains('.m3u8')) {


      return
        _loading?Center(
        child:CircularProgressIndicator(),
      ):
      Container(
        child: WebView(
          initialUrl: Uri.dataFromString(externalurl , mimeType: 'text/html').toString(),
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController webViewController) {
            _controller.complete(webViewController);
          },
        ),
      );


    }
    else if(url.contains('https://www.youtube.com/')){
      String videoID= YoutubePlayer.convertUrlToId(url);

      String youtube = '''
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.plyr.io/3.6.2/plyr.css" />
<script src="https://cdn.plyr.io/3.6.2/plyr.polyfilled.js"></script>

<style>
.container {
    margin: 20px auto;
    max-width: 100%;
}
</style>
</head>
<body>
<div class="container">
    <div id="player" data-plyr-provider="youtube" data-plyr-embed-id="$videoID"></div>
</div>

<script src="path/to/plyr.js"></script>
<script>
  const player = new Plyr('#player');
</script>


</body>
</html>
''';
      return
        _loading?Center(
        child:CircularProgressIndicator(),
      ):
        Container(
        child: WebView(
          initialUrl: Uri.dataFromString(youtube , mimeType: 'text/html').toString(),
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController webViewController) {
            _controller.complete(webViewController);
          },
        ),
      );

    }


  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    问题是由您的列表 userData 引起的。不知道你为什么给它一个 null 值并自找麻烦,但你可以将它分配为一个空列表。

    每当您想调用该列表或对其执行操作时,您都可以检查它是否为空或有值。喜欢你代码中的这一行var url =userData[0]['link'];

    改成:

    var url =userData != null && userData.isNotEmpty ? userData[0]['link'] : 'No link yet';
    

    您收到的错误是因为您告诉 dart 访问 userData[0]['link'] ==> 意味着您告诉它去列表 userData,然后获取该列表的长度,在您完成该长度后,转到索引 [0] 处的项目,并访问 ['link'] 键并返回它的值。

    通过检查您的列表不为空,您可以避免此类错误。

    在编写代码时,请尽量牢记代码可能出现的问题,以及如何提前解决问题,通过检查可能的空值,这将使您的代码更高效,更不容易出现错误和错误也是。如果您刚刚开始,请考虑迁移到零安全,您会在不久的将来为此感谢自己。编码愉快。

    【讨论】:

    • 谢谢你的观点是正确的,我用另一种方式克服它
    • 不客气@aneelilyas,​​请发布您的解决方案,以便其他人在遇到类似问题时也能注意到它。
    【解决方案2】:

    在未加载数据之前我使用了简单的解决方案我使用了进度条

    return _loading?Center( 孩子:CircularProgressIndicator( valueColor: new AlwaysStoppedAnimation(Colors.amberAccent), ), ):媒体播放器();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 2021-08-05
      • 2021-08-28
      • 1970-01-01
      • 2021-11-18
      • 2021-09-29
      • 2020-10-28
      • 2018-11-16
      相关资源
      最近更新 更多