在状态更改期间触发群体事件以打开模式

时间:2020-02-28 11:40:44

标签: flutter bloc state-management flutter-bloc

使用flutter_bloc在flutter的状态更改期间触发事件是否是一种好习惯(或至少可能)? 如:

if (state is SomeState) {
  _bloc.add(Event())
}

在这种情况下,我的用例是触发模式作为对某些状态更改的反应,但是每次我执行此操作(与BlocListener和BlocBuilder一起尝试)时,模式始终会触发两次,因为您必须关闭2个模式。 / p>

我必须这样做,因为我进行了2次api调用,每个事件触发一个调用,例如PostEvent和GetEvent,并且我希望模式仅在第二个完成后才打开。

PostEvent->请求-> StateChange->构建器-> add(GetEvent)->请求-> StateChange->构建器-> showModal()

我还想知道我是否应该使用相同的方法进行两个调用,但尚未进行测试。

经过一番挖掘,我发现即使事件仅添加一次,该小部件仍以相同状态(例如GetFinished)重建了2次,因此显示了2个模态。

任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

如果我理解正确,我建议您这样做:

1-使您的全状态窗口小部件在initState上监听bloc.stream(记住在处理时取消订阅)

2-在收听新数据时,您触发该模式

3-请求后,您调用_bloc.add()方法以触发模态。

4-例子:

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('test')),
        body: BodyWidget(),
      ),
    );
  }
}

class BodyWidget extends StatefulWidget {
  @override
  BodyWidgetState createState() {
    return new BodyWidgetState();
  }
}

class BodyWidgetState extends State<BodyWidget> {
  StreamSubscription subscription;

  @override
  void initState(){
    super.initState();
    subscription = _bloc.yourStream$.listen((data) async {
      await showDialog(context: context);
    });
  }

  @override
  void dispose() {
    subscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

如您所见,我只是在谈论流,而不使用任何外部第3个程序包。

这应该正常工作