Вложенность BlocBuilders для управления несколькими состояниями в одном и том же виджете

Я хотел вложить текст Update BlocBuilder в другой BlocBuilder, который управляет размером шрифта через виджет ползунка. Но я не могу заставить его работать. Пожалуйста помоги!

BlocBuilder<SettingsBloc, SettingsState>(
            builder: (context, state) {
       return BlocBuilder<TextFieldBloc, TextFieldState>(
        builder: (context, state) {
          if (state is TextFieldInitState) {
            return Text(
                state.text.toString(),
              style: TextStyle(
                fontSize: state.fontSize,
                fontFamily: 'EthiopicWookianos',
                fontWeight: FontWeight.normal,
                color: Colors.blueGrey,
              ),
            );
          } else if (state is TextFieldLaterState) {
            return Text(
              state.text.toString(),
              style: TextStyle(
                fontSize: state.fontSize,
                fontFamily: 'EthiopicWookianos',
                fontWeight: FontWeight.normal,
                color: Colors.blueGrey,
              ),
            );
          } else {
            return Text("something wrong");
          }
});
}),

Вот код для TextField Bloc ... (конечно, они находятся в отдельных файлах).

import 'package:flutter/widgets.dart';

abstract class TextFieldEvent {}

class TextInit extends TextFieldEvent {

}

class TextChange extends TextFieldEvent {
  final String data;
  TextChange({@required this.data});
}

class TextFieldState {}

class TextFieldInitState extends TextFieldState {
  String text;
  TextFieldInitState({this.text});
}

class TextFieldLaterState extends TextFieldState {
  String text;
  TextFieldLaterState({this.text});
}

class TextFieldBloc extends Bloc<TextFieldEvent, TextFieldState> {
  @override
  get initialState => TextFieldInitState(text: '');

  @override
  Stream<TextFieldState> mapEventToState(event) async* {
    if (event is TextInit) {
      yield TextFieldInitState(text: "");
    } else if (event is TextChange) {
      yield TextFieldLaterState(text: event.data);
    }
  }
}

Вот код блока настроек ... (они тоже в отдельных файлах).

part of 'settings_bloc.dart';

@immutable
abstract class SettingsEvent {
  final dynamic payload;
  SettingsEvent(this.payload);

  }

class FontSize extends SettingsEvent {
FontSize(payload) : super(payload);
}

abstract class SettingsState {
  final double sliderFontSize;

  SettingsState({this.sliderFontSize});

  double get fontSize => sliderFontSize;

}


class InitialSettingsState extends SettingsState {
  InitialSettingsState() : super(
    sliderFontSize: 20,
  );

}

class NewSettingsState extends SettingsState {
  NewSettingsState.fromOldSettingsState(SettingsState oldState,
      {double sliderFontSize})
      : super(
    sliderFontSize: sliderFontSize ?? oldState.sliderFontSize,
  );
}

class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {


  @override
  SettingsState get initialState => InitialSettingsState();


  @override
  Stream<SettingsState> mapEventToState(SettingsEvent event) async* {
    if (event is FontSize) {
      SettingsState currentState;
      yield NewSettingsState.fromOldSettingsState(
          currentState, sliderFontSize: event.payload);
    }

  }

}

person Jonathan Daniels    schedule 29.03.2020    source источник
comment
добавить классы TextFieldInitState и TextFieldLaterState и все, что когда-либо было связано с обоими блоками.   -  person Viren V Varasadiya    schedule 29.03.2020


Ответы (1)


вы используете два блока вместе, и для состояния у вас одинаковое имя переменной. поэтому, когда вы его используете, он будет учитывать только внутреннюю переменную состояния.

поэтому я думаю, что если вы просто измените имя переменной settingstate, она должна работать. попробуйте.

BlocBuilder<SettingsBloc, SettingsState>(
            builder: (context, Settingstate) { //change variable name
       return BlocBuilder<TextFieldBloc, TextFieldState>(
        builder: (context, state) {
          if (state is TextFieldInitState) {
            return Text(
                state.text.toString(),
              style: TextStyle(
                fontSize: Settingstate.fontSize, // change variable name
                fontFamily: 'EthiopicWookianos',
                fontWeight: FontWeight.normal,
                color: Colors.blueGrey,
person Viren V Varasadiya    schedule 29.03.2020
comment
Это сработало!!! Спасибо тебе огромное, ты сэкономил мне кучу часов. :-) - person Jonathan Daniels; 29.03.2020