Flutter 更新事件后,流值未更改。。(阵阵骚动)

Flutter 更新事件后,流值未更改。。(阵阵骚动),flutter,bloc,Flutter,Bloc,我对颤振是个新手,现在我正在研究颤振中的团模式。 所以我试图实现一个功能,用户点击按钮(蓝色或绿色),它应该改变主题颜色蓝色或绿色。 但问题是我将initiaData设置为紫色,即使用户单击绿色或蓝色按钮,它也只显示橙色主题 飞镖 abstract class ChangeColorEvent {} class ChangeToGreen extends ChangeColorEvent {} class ChangeToBlue extends ChangeColorEvent {}

我对颤振是个新手,现在我正在研究颤振中的团模式。 所以我试图实现一个功能,用户点击按钮(蓝色或绿色),它应该改变主题颜色蓝色或绿色。 但问题是我将initiaData设置为紫色,即使用户单击绿色或蓝色按钮,它也只显示橙色主题

飞镖

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 
}