Flutter 更新事件后,流值未更改。。(阵阵骚动)
我对颤振是个新手,现在我正在研究颤振中的团模式。 所以我试图实现一个功能,用户点击按钮(蓝色或绿色),它应该改变主题颜色蓝色或绿色。 但问题是我将initiaData设置为紫色,即使用户单击绿色或蓝色按钮,它也只显示橙色主题 飞镖Flutter 更新事件后,流值未更改。。(阵阵骚动),flutter,bloc,Flutter,Bloc,我对颤振是个新手,现在我正在研究颤振中的团模式。 所以我试图实现一个功能,用户点击按钮(蓝色或绿色),它应该改变主题颜色蓝色或绿色。 但问题是我将initiaData设置为紫色,即使用户单击绿色或蓝色按钮,它也只显示橙色主题 飞镖 abstract class ChangeColorEvent {} class ChangeToGreen extends ChangeColorEvent {} class ChangeToBlue extends ChangeColorEvent {}
abstract class ChangeColorEvent {}
class ChangeToGreen extends ChangeColorEvent {}
class ChangeToBlue extends ChangeColorEvent {}
团镖
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:theme_change/bloc/colorTheme/event.dart';
class ColorThemeBloc {
var _theme =
ThemeData(brightness: Brightness.light, primaryColor: Colors.orange);
final _colorStateController = StreamController();
StreamSink get _inTheme => _colorStateController.sink;
Stream get theme => _colorStateController.stream;
final _colorEventController = StreamController<ChangeColorEvent>();
Sink<ChangeColorEvent> get changeColorEventSink => _colorEventController.sink;
ColorThemeBloc() {
//wherever there's a new event we want to map it to a new state
_colorEventController.stream.listen(_mapEventToState);
}
void _mapEventToState(ChangeColorEvent event) {
print(event);
if (event is ChangeToGreen)
_theme =
ThemeData(brightness: Brightness.light, primaryColor: Colors.red);
else
_theme =
ThemeData(brightness: Brightness.light, primaryColor: Colors.pink);
_inTheme.add(_theme);
print(_theme);
}
void dispose() {
_colorEventController.close();
_colorStateController.close();
}
}
主飞镖
class MyApp extends StatelessWidget {
final _bloc = ColorThemeBloc();
@override
Widget build(BuildContext context) {
return StreamBuilder(
initialData: ThemeData(
brightness: Brightness.light, primaryColor: Colors.purple),
stream: _bloc.theme,
builder: (context, snapshot) {
return MaterialApp(
theme: snapshot.data,
title: 'Flutter Demo',
home: DemoScreen(),
);
});
}
}
您还没有扩展抽象事件上的Equatable,它用于标识事件对象是否相同。将事件类更改为以下内容:
abstract class ChangeColorEvent extends Equatable{}
class ChangeToGreen extends ChangeColorEvent {
// Add props, if you want to return data, else
}
class ChangeToBlue extends ChangeColorEvent {
// Add props, if you want to return data, else
}
嗨,谢谢你的回答,但是很难理解怎么回答。。因为如果我想通过道具,我应该在抽象类changeColorEvent中完成,不是吗?像抽象类ChangeColorEvent扩展equalable{@override List get props=>[];}一样,Bloc将事件转换为状态,因此本质上需要根据事件映射逻辑。看到这个例子,您将更加了解如何设置状态和事件。
abstract class ChangeColorEvent extends Equatable{}
class ChangeToGreen extends ChangeColorEvent {
// Add props, if you want to return data, else
}
class ChangeToBlue extends ChangeColorEvent {
// Add props, if you want to return data, else
}