flutter [В инициализаторах доступны только члены stati c] - PullRequest
0 голосов
/ 09 мая 2020

Я настоящий новичок в флаттере и дротике. У меня проблема с воспроизведением видео на YouTube с помощью [youtube_player_flutter: ^ 6.1.1]. Я создаю файл Json со ссылками на YouTube и хочу связать его с [youtube_player_flutter: ^ 6.1.1]. но он всегда отображает сообщение об ошибке [В инициализаторах можно получить доступ только к членам stati c]

          @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 голосов
/ 09 мая 2020

Возможно, вы дважды кодировали переменную 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 или Сделайте первую букву класса заглавной . Это лучшая практика при написании кода. Я надеюсь, что это в некотором смысле поможет вам. Спасибо :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...