jenny
jenny

Reputation: 347

stream value does not changed after update event.. (Flutter,bloc)

I'm really new to flutter and now I'm studying bloc pattern in flutter. so I'm trying to implement a function which user click button (blue or green), it should change the theme color blue or green. but the problem is I set initiaData as purple color and it just shows orange theme even user click the green or blue button.

event.dart

abstract class ChangeColorEvent {}

class ChangeToGreen extends ChangeColorEvent {}

class ChangeToBlue extends ChangeColorEvent {}

bloc.dart

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();
  }
}

themeChange.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'),
            )
          ],
        ),
      ),
    );
  }
}

main.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(),
          );
        });
  }
}

Upvotes: 0

Views: 640

Answers (1)

Jay Dangar
Jay Dangar

Reputation: 3469

You haven't extended Equatable on Abstract Event, which is used to identify if event Object is same or not. change your event class to following :

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 
}

Upvotes: 1

Related Questions