颤振:BehaviorSubject 未重建小部件

时间:2021-07-29 17:28:43

标签: flutter rxdart

我正在尝试在我的无状态小部件上使用 Rxdart:

class SimplePrioritySelectWidget extends StatelessWidget {
  BehaviorSubject<List<String>> _valueNotifier =
      BehaviorSubject<List<String>>.seeded([]);

我用 StreamBuilder 包装了我的小部件:

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: _valueNotifier.stream,
      initialData: options,
      builder: (context, snapshot) {
        print("rebuild");
        return Padding(
          padding: const EdgeInsets.only(top: 25),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              SizedBox(
                height: 16.h,
              ),

我有一个自定义下拉小部件,我不知道为什么,当我在 _valueNotifier 中添加字符串时,未调用构建器方法?我的小部件没有重建?怎么了?

  CustomDropdown(
    dropdownMenuItemList: options,
    enableBorderColor: Color(PRIMARY_COLOR_2),
    onChanged: (value) {

      _valueNotifier.value.add(value);
    
    },

  ),

2 个答案:

答案 0 :(得分:1)

我完全同意 您需要在 sink

中使用 _valueNotifier
  CustomDropdown(
    dropdownMenuItemList: options,
    enableBorderColor: Color(PRIMARY_COLOR_2),
    onChanged: (value) {
      _valueNotifier.sink.add([value]);
    },

  ),

答案 1 :(得分:0)

改变值不会通知 BehaviorSubject 任何事情。为了让 BehaviorSubject 通知其侦听器,您需要提供不同的状态对象。

  CustomDropdown(
    dropdownMenuItemList: options,
    enableBorderColor: Color(PRIMARY_COLOR_2),
    onChanged: (value) {
Sta
      _valueNotifier.value = [..._valueNotifier.value, value];
      // or _valueNotifier.add([..._valueNotifier.value, value]);
    },

  ),

此外,BehaviorSubject 是状态,不应在 StatelessWidget 中创建。如果您仍然尝试,则每次重新构建小部件时都会创建主题(具有相同的初始值)。