颤抖[只能在初始化程序中访问静态成员]

时间:2020-05-09 17:47:17

标签: flutter dart

我是一位真正的初学者。 我有一个关于使用[youtube_player_flutter:^ 6.1.1]播放youtube视频的问题 我用youtube链接创建了一个Json文件,我想将其与[youtube_player_flutter:^ 6.1.1]链接。但它始终显示错误消息[只能在初始化程序中访问静态成员]

          @override
      Widget build(BuildContext context) {
        // this function is called before the build so that
        // the string assettoload is avialable to the DefaultAssetBuilder
        setasset();
        // and now we return the FutureBuilder to load and decode JSON
        return FutureBuilder(
          future:
              DefaultAssetBundle.of(context).loadString(assettoload, cache: true),
          builder: (context, snapshot) {
            List mydata = json.decode(snapshot.data.toString());
            if (mydata == null) {
              return Scaffold(
                body: Center(
                  child: Text(
                    "Loading",
                  ),
                ),
              );
            } else {
              return quizpage(mydata: mydata);
            }
          },
        );
      }
    }

    class quizpage extends StatefulWidget {
      final dynamic mydata;
      ////////var youtubeUrl;
      quizpage({Key key, @required this.mydata}) : super(key: key);
      @override
      _quizpageState createState() => _quizpageState(mydata);
    }

    class _quizpageState extends State<quizpage> {
      var mydata;

      _quizpageState(this.mydata);

      int marks = 0;
      int i = 1;

  @override
  void setState(fn) {
    if (mounted) {
      super.setState(fn);
    }
  }
  YoutubePlayerController _controller;

  @override
  void initState() {
    _controller = YoutubePlayerController(
        initialVideoId: YoutubePlayer.convertUrlToId(mydata[4]["1"]));
    super.initState();
  }

  void nextquestion() {
    setState(() {
      if (i < 10) {
        i++;
      } else {
        Navigator.of(context).pushReplacement(MaterialPageRoute(
          builder: (context) => resultpage(marks: marks),
        ));
      }

问题是我想让[String videoURL]播放json数据文件中的视频列表。

谢谢。

1 个答案:

答案 0 :(得分:0)

可能性是您对变量mydata进行了两次编码。这是您应该遵循的格式。并且为了利用构造函数中StatefulWidget中的变量,请使用widget.mydata。不必两次声明。

代码:

class Quizpage extends StatefulWidget {
  final dynamic mydata;

  quizpage({Key key, @required this.mydata}) : super(key: key);

  @override
  _QuizpageState createState() => _QuizpageState();
}

class _QuizpageState extends State<Quizpage> {
  /* 
    You can make use of your mydata in this class like this:
    widget.mydata, and you will be able to make it work
  */
  Color colortoshow = Colors.indigoAccent;
  Color right = Colors.green;
  Color wrong = Colors.red;
  int marks = 0;
  int i = 1;

  // String videoURL ="https://www.youtube.com/watch?v=2OAdfB2U88A&t=593s";
  YoutubePlayerController _controller;


  // Use like this to make use of your array mydata
  String videoURL = widget.myData[4]["1"];

  @override
  void initState() {
    _controller = YoutubePlayerController(
        initialVideoId: YoutubePlayer.convertUrlToId(videoURL));
    super.initState();
  }
}

这也是出于编码的角度。请遵循Flutter中正确的类命名方法。始终使用 CamelCase 将课程的第一个字母大写。这是编写代码时的最佳实践。希望以上内容在某种程度上对您有所帮助。谢谢:)