在初始化器中只能访问静态memebr

时间:2019-09-28 10:50:07

标签: flutter dart

我正在将变量传递到其他屏幕,并且我想将其用作videoplayer的值,但是却遇到此错误Only static members can be accessed in initializes,我试图找到解决方案,但是到处都找到了将final替换为比static关键字更有效,但id不适用于我,但适用于其他人。我正在按widget.title使用该标题,但是另一方面,我在Text(widget.title,),中使用了同样的错误,并且在这里效果很好,但在最终videoPlayerController = VideoPlayerController.network(widget.title);中却无法正常使用

import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:firebase_admob/firebase_admob.dart';
import 'package:video_player/video_player.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';


class ChewieListItem extends StatefulWidget {
  final String title;
  ChewieListItem({this.title});
  bool looping;
  @override
  _ChewieListItemState createState() => _ChewieListItemState();
}

class _ChewieListItemState extends State<ChewieListItem> {
  List data =[];
  final videoPlayerController = VideoPlayerController.network(widget.title);
//  static videoPlayerController = VideoPlayerController.network(widget.title);
  ChewieController _chewieController;

  @override
  void initState() {
    super.initState();
    fetchData();
    _chewieController = ChewieController(
      videoPlayerController: videoPlayerController,
      aspectRatio: 16 / 9,
      autoInitialize: true,
      looping: widget.looping,
      errorBuilder: (context, errorMessage) {
        return Center(
          child: Text(
            errorMessage,
            style: TextStyle(color: Colors.white),
          ),
        );
      },
    );
  }
  void fetchData() async {
    final response = await http
        .get('http://salterz.com/gtv_json/link.json');
    if (response.statusCode == 200) {
      setState(() {
        data = json.decode(response.body);

//         Final=dataleft +data +dataright;

      });
    }
  }
  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations(
        [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
    return Stack(
          children: <Widget>[
            Chewie(
              controller: _chewieController,
            ),
            Text(widget.title,),
          ],
        );
  }
  @override
  void dispose() {
    super.dispose();
    // IMPORTANT to dispose of all the used resources
    videoPlayerController.dispose();
    _chewieController.dispose();
  }
}

2 个答案:

答案 0 :(得分:1)

方法1:在构建状态时将其传递

在对象构造/初始化变量的过程中,它只是一个Dart类,它对小部件等一无所知。
要解决您的问题,只需将title传递给State,例如

class ChewieListItem extends StatefulWidget {
  final String title;
  ChewieListItem({this.title});
  bool looping;
  @override
  _ChewieListItemState createState() => _ChewieListItemState(title: title);
}
class _ChewieListItemState extends State<ChewieListItem> {
  final String title;   
  final VideoPlayerController videoPlayerController;
_ChewieListItemState({this.title}): videoPlayerController = VideoPlayerController.network(title);
...
}

方法2:在initState中初始化videoPlayerController


Or initialize `VideoPlayerController` in `initState` and destory in `dispose`.

class _ChewieListItemState extends State<ChewieListItem> {
  List data =[];
  VideoPlayerController videoPlayerController;
  ChewieController _chewieController;

  @override
  void initState() {
    super.initState();
    videoPlayerController = VideoPlayerController.network(widget.title);
    ...
  }

  @override
  void dispose() {
    super.dispose();
    videoPlayerController.dispose();
    ...
  }
  ..
}

这样,您可以比第一个选项拥有更好的清除效果。我更喜欢第二种选择。

答案 1 :(得分:1)

根据第二种方法,您将无法配置视频播放器。因此,第一种方法会很好用。