CircularProgressIndicator

CircularProgressIndicator

我的问题是,CircularProgressIndicator不会停止缓冲。我的目标是,当视频检测到滞后状态时,CircularProgressIndicator将显示,当再次播放时,CircularProgressIndicator将停止显示。

bool vidBuffering = true;

void buffer() {
    setState(() {
      vidBuffering = !vidBuffering;
    });
  }
这是在小部件内部,我将其称为vidBuffering
Widget _buildPlayStack() {
    return Stack(
      children: [
        _buildPlay(),
          child: FlatButton(
            onPressed: () => setState(() {
               _vidController.value.isPlaying ? _vidController.pause() :_vidController.play();
            }),
            child: Center(
              child: (_vidController.value.isPlaying)
                      ? Icon(Icons.pause, color: Colors.green)
                      : Icon(Icons.play_arrow, color: Colors.green),
            ),
          ),
        Center(
            child: _vidBuffering
                ? const CircularProgressIndicator()
                : null),
      ],
    );
  }
Widget _buildPlay() {
    return Container(
      child: AspectRatio(
          aspectRatio: _vidController.value.aspectRatio,
          child: VideoPlayer(_controller),
        ),
    );
  }

最佳答案

应该将StreamBuilder用于仅更新Loader
例如 :

class Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState();
}

   class _DemoState extends State<Demo> {
  bool vidBuffering = true;
  StreamController streamControllerBuffering = StreamController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _buildPlayStack(),
            RaisedButton(
              onPressed: () => buffer(),
              child: Text(vidBuffering ? 'Hide' : 'Show'),
            )
          ],
        ),
      ),
    );
  }

  void buffer() {
    vidBuffering = !vidBuffering;
    streamControllerBuffering.sink.add(vidBuffering);
  }

  Widget _buildPlayStack() {
    return Stack(
      children: [
        _buildPlay(),
        FlatButton(
          onPressed: () => setState(() {
            /*_vidController.value.isPlaying
                    ? _vidController.pause()
                    : _vidController.play();*/
          }),
          child: Center(
            child: (/*_vidController.value.isPlaying*/ true)
                ? Icon(Icons.pause, color: Colors.green)
                : Icon(Icons.play_arrow, color: Colors.green),
          ),
        ),
        Center(
          child: StreamBuilder(
              initialData: true,
              stream: streamControllerBuffering.stream,
              builder: (builder, snapshot) {
                if (snapshot.hasData && snapshot.data) {
                  return CircularProgressIndicator();
                } else {
                  Offstage();
                }
                return Offstage();
              }),
        ),
      ],
    );
  }

  Widget _buildPlay() {
    return Container(
      height: 200,
      width: 200,
      color: Colors.amber,
    );
  }

  @override
  void dispose() {
    streamControllerBuffering.close();
    super.dispose();
  }
}

08-17 18:10