flutter - 更新事件后流值不会改变.. (Flutter,bloc)
问题描述
我对颤动真的很陌生,现在我正在研究颤动中的 bloc 模式。所以我正在尝试实现一个用户单击按钮(蓝色或绿色)的功能,它应该将主题颜色更改为蓝色或绿色。但问题是我将 initiaData 设置为紫色,即使用户单击绿色或蓝色按钮,它也只显示橙色主题。
事件.dart
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();
}
}
主题更改.dart
import 'package:flutter/material.dart';
import 'package:theme_change/bloc/colorTheme/bloc.dart';
import 'package:theme_change/bloc/colorTheme/event.dart';
class ThemeChange extends StatelessWidget {
// final bool isDarkThemeEnabled;
// final ThemeBloc bloc;
final _bloc = ColorThemeBloc();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
RaisedButton(
onPressed: () {
Navigator.pop(context);
},
color: Colors.grey,
child: Text('GO BACK'),
),
// ListTile(
// title: Text("Dark Theme"),
// trailing: Switch(
// value: isDarkThemeEnabled, onChanged: bloc.changeTheTheme),
// ),
RaisedButton(
onPressed: () => _bloc.changeColorEventSink.add(ChangeToBlue()),
color: Colors.blue,
child: Text('blue'),
),
RaisedButton(
onPressed: () => _bloc.changeColorEventSink.add(ChangeToGreen()),
color: Colors.green,
child: Text('Green'),
)
],
),
),
);
}
}
主要.dart
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
}
推荐阅读
- javascript - Brain.js 倒数/反向训练(从输出预测输入)
- visual-studio-code - VSCode 不默认为 \n 行尾
- git - Git reset --soft HEAD~40 抛出错误
- android - 为 Switch 标签设置自定义字体
- json - FullCalendar-Scheduler Google Calendars ResourceIDs 查询
- javascript - 如何在Javascript中删除继承的对象值?
- sql - DD MON YYYY 至 YYMMn6
- ios - 如何使用 Color Array (Swift) 中的数据
- django - 如何将标志传递给 DRF 中的子序列化程序
- python - 模型字段的表单在 django admin 中消失