Flutter 颤振:“;实例成员';小部件';can';不能在初始值设定项中访问。”;

Flutter 颤振:“;实例成员';小部件';can';不能在初始值设定项中访问。”;,flutter,dart,Flutter,Dart,我正在尝试获取youtube\u player\u flatter软件包的一个youtube视频链接,它是在我的VideoCard.dart文件中编写的。现在,我将视频链接作为参数传递给我创建的构造函数,但我得到的实例成员“widget”无法在初始值设定项中访问。 我认为问题在于使用无状态小部件,但即使将其更改为有状态,问题仍然存在 class _VideoCardState extends State<VideoCard> { // static String videoID

我正在尝试获取
youtube\u player\u flatter
软件包的一个youtube视频链接,它是在我的
VideoCard.dart
文件中编写的。现在,我将视频链接作为参数传递给我创建的构造函数,但我得到的
实例成员“widget”无法在初始值设定项中访问。

我认为问题在于使用无状态小部件,但即使将其更改为有状态,问题仍然存在

class _VideoCardState extends State<VideoCard> {
  // static String videoID = 'PQSagzssvUQ';
  String videoId = widget.url;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    videoId = widget.url;
  }

  YoutubePlayerController _controller = YoutubePlayerController(
    initialVideoId: videoId,
    flags: YoutubePlayerFlags(
      autoPlay: true,
      mute: false,
    ),
  );
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      child: Container(
        decoration: BoxDecoration(
          color: Color(0xffff8f8f8),
          borderRadius: BorderRadius.circular(15),
        ),
        child: YoutubePlayer(
          controller: _controller,
          liveUIColor: Colors.amber,
          showVideoProgressIndicator: true,
        ),
      ),
    );
  }
}
class\u VideoCardState扩展状态{
//静态字符串videoID='PQSagzssvUQ';
字符串videoId=widget.url;
@凌驾
void initState(){
//TODO:实现initState
super.initState();
videoId=widget.url;
}
YoutubePlayerController\u controller=YoutubePlayerController(
initialVideoId:videoId,
标志:YoutubePlayerFlags(
自动播放:对,
哑巴:错,
),
);
@凌驾
小部件构建(构建上下文){
返回容器(
身高:200,
子:容器(
装饰:盒子装饰(
颜色:颜色(0xffff8f8f8),
边界半径:边界半径。圆形(15),
),
孩子:YoutubePlayer(
控制器:_控制器,
liveUIColor:Colors.amber,
showVideoProgressIndicator:对,
),
),
);
}
}
更新1:

class _VideoCardState extends State<VideoCard> {
  String get videoId => widget.url;

  // videoId = YoutubePlayer.convertUrlToId(
  //         "https://www.youtube.com/watch?v=S9bCLPwzSC0")
  //     .toString();
  @override
  void initState() {
    super.initState();
    // print(widget.url);
    videoId = widget.url;
  }

  YoutubePlayerController _controller = YoutubePlayerController(
    initialVideoId: videoId, ------------------------> The instance member 'videoId' can't be accessed in an initializer.
    flags: YoutubePlayerFlags(
      autoPlay: true,
      mute: false,
    ),
  );
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      child: Container(
        decoration: BoxDecoration(
          color: Color(0xffff8f8f8),
          borderRadius: BorderRadius.circular(15),
        ),
        child: YoutubePlayer(
          controller: _controller,
          liveUIColor: Colors.amber,
          showVideoProgressIndicator: true,
        ),
      ),
    );
  }
}
class\u VideoCardState扩展状态{
字符串get videoId=>widget.url;
//videoId=youtubeplyer.convertUrlToId(
//         "https://www.youtube.com/watch?v=S9bCLPwzSC0")
//.toString();
@凌驾
void initState(){
super.initState();
//打印(widget.url);
videoId=widget.url;
}
YoutubePlayerController\u controller=YoutubePlayerController(
initialVideoId:videoId,--------------------------->无法在初始值设定项中访问实例成员“videoId”。
标志:YoutubePlayerFlags(
自动播放:对,
哑巴:错,
),
);
@凌驾
小部件构建(构建上下文){
返回容器(
身高:200,
子:容器(
装饰:盒子装饰(
颜色:颜色(0xffff8f8f8),
边界半径:边界半径。圆形(15),
),
孩子:YoutubePlayer(
控制器:_控制器,
liveUIColor:Colors.amber,
showVideoProgressIndicator:对,
),
),
);
}
}
您可以尝试使用以下代码:

class _VideoCardState extends State<VideoCard> {
  String get videoId => widget.url;

  YoutubePlayerController get _controller => YoutubePlayerController(
    initialVideoId: videoId,
    flags: YoutubePlayerFlags(
      autoPlay: true,
      mute: false,
    ),
  );

  ...

}
class\u VideoCardState扩展状态{
字符串get videoId=>widget.url;
YoutubePlayerController get _controller=>YoutubePlayerController(
initialVideoId:videoId,
标志:YoutubePlayerFlags(
自动播放:对,
哑巴:错,
),
);
...
}

这就是我的工作原理:

class _VideoCardState extends State<VideoCard> {
  late String videoId;
  late YoutubePlayerController _controller;

  @override
  void initState() {
    super.initState();
    videoId = YoutubePlayer.convertUrlToId(widget.url).toString();

    _controller = YoutubePlayerController(
      initialVideoId: videoId,
      flags: YoutubePlayerFlags(
        autoPlay: false,
        mute: false,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      child: Container(
        decoration: BoxDecoration(
          color: Color(0xffff8f8f8),
          borderRadius: BorderRadius.circular(15),
        ),
        child: YoutubePlayer(
          controller: _controller,
          liveUIColor: Colors.amber,
          showVideoProgressIndicator: true,
        ),
      ),
    );
  }
}
class\u VideoCardState扩展状态{
晚字符串videoId;
后期YoutubePlayerController\u控制器;
@凌驾
void initState(){
super.initState();
videoId=youtubeplyer.convertUrlToId(widget.url.toString();
_控制器=YoutubePlayerController(
initialVideoId:videoId,
标志:YoutubePlayerFlags(
自动播放:错误,
哑巴:错,
),
);
}
@凌驾
小部件构建(构建上下文){
返回容器(
身高:200,
子:容器(
装饰:盒子装饰(
颜色:颜色(0xffff8f8f8),
边界半径:边界半径。圆形(15),
),
孩子:YoutubePlayer(
控制器:_控制器,
liveUIColor:Colors.amber,
showVideoProgressIndicator:对,
),
),
);
}
}

在哪里?在init状态内部?或者当我第一次声明时?删除它会引发错误:
必须初始化不可为空的变量“videoId”。
nope仍然不工作。我已经用你建议的代码更新了我的代码现在还不走运。我仍然得到
无法在初始值设定项中访问实例成员“videoId”。
initialVideoId:videoId,