Обновлять свойство Value / Стоимость DropDownItem, загруженного посредством Блокнота Pattern

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

У меня есть блокнот, у которого есть 2 streams, один для списка "holdings" и другого для "отборного холдинга"; списком загружается dropdownitem (у этого нет проблем в том, чтобы быть загруженным), и с другим я делаю sink отборного холдинга (здесь проблема), вышеупомянутое распределенное в свойство "оцените" DropDownItem, но он дает мне ошибку. Взамен, если я комментирую свойство, "оцените" изогнутого оно не функционирует показывая мой отборный выбор.

DropDownItem value en blanco

Изображение не показывает ошибку, так как свойство "оценило" dropDownItem, комментировалось.

Это моя функция, которую возвращает StreamBuilder:

Widget _holdingDropDown() {
return StreamBuilder(
    stream: bloc.holding,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      print(snapshot.data.id);
      return Container(
        child: Center(
          child: snapshot.hasData
              ? StreamBuilder(
                  stream: bloc.obsHoldingList,
                  initialData: bloc.obsHoldingList.value,
                  builder: (BuildContext context,
                      AsyncSnapshot> holdingListSnapshot) {
                    return holdingListSnapshot.hasData ?
                    DropdownButton(
                      // value: snapshot.data,
                      items: _listDropDownHoldings,
                      onChanged: (Holding h) {
                        _changeDropDownItemHolding(h);
                      },
                    ): CircularProgressIndicator();
                  },
                )
              : CircularProgressIndicator(),
        ),
      );
    });
}

Ошибка, которая я dá является следующей:

I/flutter (18314): The following assertion was thrown building StreamBuilder> (dirty, state: I/flutter (18314): _StreamBuilderBaseState, AsyncSnapshot>> #c9a1d): I/flutter (18314): 'package:flutter / src / материал / dropdown.dart': Failed assertion: line 514 pos 15: ' статьи == null || I/flutter (18314): оцените == null || items.where ((DropdownMenuItem статья) => item.value == оцените) .length == 1': is not I/flutter (18314): true.

Я могу думать, что он проистекает того, что он не находит статью в списке, со стоимостью, которую я даю ему, но не является таким. Не, если он имел общее с временами строительства.

Я надеюсь объясниться хорошо, любая идея, которую они могли бы давать мне, была бы много помощи.

РЕДАКТИРОВАНИЕ

Я присоединяю классы блокнота и методов, названных из StreamBuilder:

login_local_form.dart (где находится streambuilder)

LoginBloc bloc;
List> _listDropDownHoldings =
  new List>();

void _updateDropdownListHolding(List _holdingList) {
  _listDropDownHoldings.clear();
  _holdingList.map((h) {
    _listDropDownHoldings
        .add(new DropdownMenuItem(value: h, child: Text(h.name)));
  }).toList();
}

@override
Widget build(BuildContext context) {
  /// Getting data from the login state container
  bloc = BlocProvider.of(context);

  /// Loading DropdownMenuItem for holdings
  bloc.fetchAllHolding();

  /// Listener to update the holding dropdown
  bloc.obsHoldingList.listen((data) {
    _updateDropdownListHolding(data);
  });
}

login_bloc.dart

final _holding = BehaviorSubject();
final _holdingList = PublishSubject>();

Stream get holding => _holding.stream;
ValueObservable> get obsHoldingList => _holdingList.stream;

Function(Holding) get changeCurrentHolding => _holding.sink.add;

fetchAllHolding() async {
await _holdingRepository
    .fetchAllHoldings()
    .then((response) {
      _holding.sink.add(response[0]);  //  Aquí cargo el stream del hoding para el value
      _holdingList.sink.add(response);
    }, onError: (error) {
      /// If we got an error we add the error on the stream
      _holdingList.sink.addError('Error loading data!');
      print(error.toString());
    })
    .timeout(Duration(seconds: Connection.timeOutSec))
    .catchError((error) {
      /// If we got an error we add the error on the stream
      _holdingList.sink.addError(error.toString());
    })
    .whenComplete(() => print('fetchAllHolding >> Complete!!'));
}

Ошибки

I/flutter (5949): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (5949): The following assertion was thrown building StreamBuilder> (dirty, state: I/flutter (5949): _StreamBuilderBaseState, AsyncSnapshot>> #7a2a6): I/flutter (5949): Failed assertion: boolean expression must not be null I/flutter (5949): I/flutter (5949): Either the assertion indicates an ошибка in the framework itself, or we should provide substantially I/flutter (5949): обитайте information in this ошибка message to help you определила and fix the underlying вызовите. I/flutter (5949): In either вступил в брак, please доклад this assertion by filing в вирус on GitHub: I/flutter (5949): https://github.com/flutter/flutter/issues/new? template=BUG.md I/flutter (5949): I/flutter (5949): When the exception was thrown, this was the stack: I/flutter (5949): #0 WhereIterator.moveNext (dart: _ internal/iterable.dart:439:11) I/flutter (5949): #1 Iterable.length (dart:core/iterable.dart:423:15) I/flutter (5949): #2 new DropdownButton (package:flutter / src / материал / dropdown.dart:514:112) I/flutter (5949): #3 _LoginLocalFormState. _ holdingDropDown. (package:my_office_th_app/screens/login/login_local_form.dart:122:33) I/flutter (5949): #4 StreamBuilder.build (package:flutter/src/widgets/async.dart:423:74) I/flutter (5949): #5 _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:125:48) I/flutter (5949): #6 StatefulElement.build (package:flutter/src/widgets/framework.dart:3809:27) I/flutter (5949): #7 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3721:15) I/flutter (5949): #8 Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5) I/flutter (5949): #9 ComponentElement. _ firstBuild (package:flutter/src/widgets/framework.dart:3701:5) I/flutter (5949): #10 StatefulElement. _ firstBuild (package:flutter/src/widgets/framework.dart:3848:11) I/flutter (5949): #11 ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5) I/flutter (5949): #12 Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14) I/flutter (5949): #13 Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12) I/flutter (5949): #14 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4867:14) I/flutter (5949): #15 Element.updateChild (package:flutter/src/widgets/framework.dart:2742:15) I/flutter (5949): #16 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16) I/flutter (5949): #17 Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5) I/flutter (5949): #18 StatelessElement.update (package:flutter/src/widgets/framework.dart:3781:5) I/flutter (5949): #19 Element.updateChild (package:flutter/src/widgets/framework.dart:2742:15) I/flutter (5949): #20 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16) I/flutter (5949): #21 Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5) I/flutter (5949): #22 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2286:33) I/flutter (5949): #23 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:676:20) I/flutter (5949): #24 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding. _ handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:219:5) I/flutter (5949): #25 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding. _ invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15) I/flutter (5949): #26 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding (package:flutter/src/scheduler/binding.dart:930:9) I/flutter (5949): #27 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding. _ handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5) I/flutter (5949): #28 _invoke (dart:ui/hooks.dart:154:13) I/flutter (5949): #29 _drawFrame (dart:ui/hooks.dart:143:3) I/flutter (5949):  I/flutter (5949): Another exception was thrown: В RenderFlex overflowed by 99676 pixels on the bottom. I/flutter (5949): Another exception was thrown: Failed assertion: boolean expression must not be null

0
задан 19.03.2019, 17:02
1 ответ

Ok, ошибка - в течение времени свежести StreamBuilders, и как ты не определяешь initialValue, это вызывает одну из ошибок (update), другая ошибка - что страховка не sobreescribiste оператор == для твоего класса Холдинг, для того, чтобы смогли сравниваться Объекты.

, Чтобы это решать, ты можешь делать следующее:

Менять это:

final _holdingList = PublishSubject<List<Holding>>();

Из-за BehaviorSubject:

final _holdingList = BehaviorSubject<List<Holding>>();

И Observable из-за одного ValueObservable:

ValueObservable<List<Holding>> get obsHoldingList => _holdingList.stream;

Ты Обновляешь твою секунду stream с initialData, asГ-:

 StreamBuilder(
                    stream: bloc.obsHoldingList,
                    initialData: bloc.obsHoldingList.value,

В конце концов, sobreescribe оператор == в твоем классе Холдинг и определи, что ты хочешь сравнить признаки, в этом одиноком случае я использую 'ямс'.

  class Holding {
    final String name;
    final String id;
    Holding(this.name, this.id);

    @override
    bool operator ==(Object other) =>
      identical(this, other) ||
      other is Holding &&
      runtimeType == other.runtimeType &&
      name == other.name;

    @override
    int get hashCode => name.hashCode;
  }


void _updateDropdownListHolding(List<Holding> _holdingList) {
  _listDropDownHoldings.clear();
  _listDropDownHoldings = _holdingList
    .map((h) => DropdownMenuItem(value: h, child: Text(h.name)))
    .toList();
}
1
ответ дан 02.12.2019, 05:28
  • 1
    Готовый Диего я это тестирую и рассказываю тебе, большое спасибо. – Rostan 19.03.2019, 16:44
  • 2
    Класс ValueObservable, которого книжный магазин? Я использую RxDart, и он не загружает меня. – Rostan 19.03.2019, 16:47
  • 3
    он принадлежит RxDart, начиная с версии 0.19.0 pub.dartlang.org/packages/rxdart#-changelog-tab - – diegoveloper 19.03.2019, 16:48
  • 4
    Загрузив 2 streams одновременно, ú ltimo он не брал изменение а следовательно когда бы то ни было он входил, использовав initialValue, решал проблему, но как раз, чтобы мочь получать ú ltimo выраженная стоимость behaviorsubject была необходима перемещать наблюдаемого valueobservable, поэтому в initialValue он используется: bloc.obsHoldingList.value < - этот ' value' только это есть у ValueObservable. – diegoveloper 19.03.2019, 17:17
  • 5
    я рекомендую тебе это супервидео flutter и programació n активируй, youtube.com/watch?v=7O1UO5rEpRc – diegoveloper 19.03.2019, 17:21