在不使用SetState的情况下调用持久性底表(使用StreamBuilder)

时间:2019-04-21 15:19:50

标签: flutter

我想实现PersistentBottomSheet,但不想使用setState()。想要实现throw streamBuilder

我已经尝试使用setState尝试以下代码,但是可以使用StreamBuilder,但未提供预期的结果

 VoidCallback _showBottomSheetCallback;

  @override
  void initState() {
    super.initState();
    _showBottomSheetCallback = _showBottomSheet;
  }

void _showBottomSheet() {
    setState(() { // disable the button
      _showBottomSheetCallback = null;
    });
    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
      final ThemeData themeData = Theme.of(context);
      return Container(
        decoration: BoxDecoration(
          border: Border(top: BorderSide(color: themeData.disabledColor))
        ),
        child: Padding(
          padding: const EdgeInsets.all(32.0),
          child: Text('This is a Material persistent bottom sheet. Drag downwards to dismiss it.',
            textAlign: TextAlign.center,
            style: TextStyle(
              color: themeData.accentColor,
              fontSize: 24.0,
            ),
          ),
        ),
      );
    })
    .closed.whenComplete(() {
      if (mounted) {
        setState(() { // re-enable the button
          _showBottomSheetCallback = _showBottomSheet;
        });
      }
    });
  }

它工作完美,但是一旦我将其包装在streamBuilder中并没有给出预期的输出 我创建了一个流,该流将在单击凸起按钮时接受一些输入,它将通知流构建器有关此流,但不会唤醒。 按下按钮时,我有onPressed: _showBottomSheetCallback,

1 个答案:

答案 0 :(得分:0)

我使用流和流生成器按如下方式实现它

在locp类中创建了一个流控制器和流以及一个要添加到流中的函数

//controller
final _bottomSheetSubject = BehaviorSubject<String>();

//stream
Observable<String> get bottomSheetEvent => _bottomSheetSubject.stream;

//add value in a stream
Function(String) get addEventBottomSheet => _bottomSheetSubject.sink.add;

在我的ui部分中,进行了以下操作

因此,snapShot中的初始数据将为字符串“ show”,并且一旦用户按下按钮,流中将要流经的数据将为“ null”,此时流构建器将被再次调用,因为它正在监听现在将流式传输要比较的数据,并且按on方法将返回null,一旦关闭底部工作表,将再次在流式中添加“ show”,并且最终流式生成器将再次以“ show”作为数据调用。

 Widget filterBtn() {
    return StreamBuilder(
      stream: homeBloc.bottomSheetEvent,
      initialData: 'show',
      builder: (BuildContext context, AsyncSnapshot<String> snapShot) {
        return RaisedButton(
          onPressed: () {
            if (snapShot.data == 'show') {
              homeBloc.addEventBottomSheet('null');
              _scaffoldKey.currentState
                  .showBottomSheet<void>((BuildContext context) {
                    final ThemeData themeData = Theme.of(context);
                    return Container(
                      decoration: BoxDecoration(
                          border: Border(
                              top: BorderSide(color: themeData.disabledColor))),
                      child: Padding(
                        padding: const EdgeInsets.all(32.0),
                        child: Text(
                          'This is a Material persistent bottom sheet. Drag downwards to dismiss it.',
                          textAlign: TextAlign.center,
                          style: TextStyle(
                            color: themeData.accentColor,
                            fontSize: 24.0,
                          ),
                        ),
                      ),
                    );
                  })
                  .closed
                  .whenComplete(() {
                    if (mounted) {
                      homeBloc.addEventBottomSheet('show');
                    }
                  });
            }
            return null;
          },
        );
      },
    );
  }