在这个(我正在构建的应用程序的一小部分)中,我有一排按钮,这些按钮使用流来选择行为(即显示数据的时间范围),这没有问题。然后,我想通过将按钮颜色设置为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
答案 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),
),
);
}
}