Flutter StreamBuilder的快照即使发送也没有日期-快照。数据始终设置为initialData

时间:2020-06-01 15:01:06

标签: flutter stream

在这个(我正在构建的应用程序的一小部分)中,我有一排按钮,这些按钮使用流来选择行为(即显示数据的时间范围),这没有问题。然后,我想通过将按钮颜色设置为Colors.red来更改所选动作。为此,我使用一个Stream(流),该Stream为按下的按钮获取一个值,以使用适当的颜色重建按钮的行。

由于未知原因,snapshot.data等于initialData:无论我按下了什么按钮。我检查了流值是附加值,然后为了使StreamController正常运行,我随后通过在var data = stream.listen((x)=> data = x)上进行测试来替换了snapshot.data测试,并且作品。

我只是不明白发生了什么事

颤振医生-v [✓] Flutter(频道稳定,v1.17.2,在Mac OS X 10.15.4 19E287上,区域设置为en-FR) •/ usr / local / flutter上的Flutter 1.17.2版 •Framework版本5f21edf8b6(4天前),2020-05-28 12:44:12 -0700 •发动机版本b851c71829 •Dart 2.8.3版

[✓] Android工具链-为Android设备开发(Android SDK版本28.0.3) •位于/ Users / jfb / Library / Android / sdk的Android SDK •平台android-29,构建工具28.0.3 •Java二进制文件,位于:/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java •Java版本OpenJDK运行时环境(AdoptOpenJDK)(内部版本1.8.0_242-b08) •接受所有Android许可。

[✓] Xcode-为iOS和macOS开发(Xcode 11.4.1) •Xcode位于/Applications/Xcode.app/Contents/Developer •Xcode 11.4.1,内部版本11E503a •CocoaPods版本1.9.1

[!] Android Studio(未安装) •找不到Android Studio;从https://developer.android.com/studio/index.html下载 (或访问https://flutter.dev/docs/get-started/install/macos#android-setup了解详细说明)。

[✓]已连接的设备(1个可用)
•iPhone 11•17CF5871-B9F8-4739-B8BB-607807AD0530•ios•com.apple.CoreSimulator.SimRuntime.iOS-13-4(模拟器)

!医生发现了1类问题。

此部分的代码:

ErrorException
Undefined index: _source

1 个答案:

答案 0 :(得分:0)

我已经使用您的代码制作了一个简单的示例,它似乎可以正常运行:

2
2
3
1

您为什么要使用Bloc?在我看来,这种事情过于矫kill过正。 从简单开始。

import 'package:flutter/material.dart';
import "dart:async";

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: ChartRangeSelectionButtons(),
        ),
      ),
    );
  }
}

var myStream = StreamController<int>.broadcast();
Stream stream = myStream.stream;
var data;  // normally should use snapshot.data

class ChartRangeSelectionButtons extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: myStream.stream,
      initialData: 2,
      builder: (context, snapshot) {
        //myStream.stream.listen((x) => data = x);
        print(snapshot.data);
        if (data == 1) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              ChartButton(title: '1W', buttonColor: Colors.red),
              ChartButton(title: '2W'),
              ChartButton(title: '3W'),
              ChartButton(title: '4W'),
            ],
          );
        } else if (data == 2) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              ChartButton(title: '1W'),
              ChartButton(title: '2W', buttonColor: Colors.red),
              ChartButton(title: '3W'),
              ChartButton(title: '4W'),
            ],
          );
        } else if (data == 3) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              ChartButton(title: '1W'),
              ChartButton(title: '2W'),
              ChartButton(title: '3W', buttonColor: Colors.red),
              ChartButton(title: '4W'),
            ],
          );
        } else {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              ChartButton(
                title: '1W',
              ),
              ChartButton(
                title: '2W',
              ),
              ChartButton(title: '3W'),
              ChartButton(title: '4W', buttonColor: Colors.red),
            ],
          );
        }
      },
    );
  }
}

class ChartButton extends StatelessWidget {
  const ChartButton({this.title, this.buttonColor = Colors.white});
  final String title;
  final buttonColor;
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 60,
      child: RaisedButton(
        onPressed: () {
          if (title == '1W') {
            //BlocProvider.of<ChartBloc>(context).inputEvent.add(ChartRange.one);
            myStream.sink.add(1);
          } else if (title == '2W') {
            //BlocProvider.of<ChartBloc>(context).inputEvent.add(ChartRange.two);
            myStream.sink.add(2);
          } else if (title == '3W') {
            //BlocProvider.of<ChartBloc>(context).inputEvent.add(ChartRange.three);
            myStream.sink.add(3);
          } else if (title == '4W') {
            //BlocProvider.of<ChartBloc>(context).inputEvent.add(ChartRange.four);
            myStream.sink.add(4);
          }
        },
        color: buttonColor,
        textColor: Colors.black,
        splashColor: Colors.grey.shade400,
        child: Text(title),
      ),
    );
  }
}