0

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

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

在这种情况下,我的用例是触发模态,作为对某些状态变化的反应,但是每次我这样做(尝试使用 BlocListener 和 BlocBuilder)时,模态总是被触发两次,因为你必须关闭 2 个模态。

我必须这样做,因为我做了 2 个 api 调用,每个事件触发一个调用 PostEvent 和 GetEvent 比方说,我希望模态仅在第二个完成后打开。

PostEvent -> Request -> StateChange -> Builder -> add(GetEvent) -> Request -> StateChange -> Builder -> showModal()

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

在进行了一些挖掘之后,我发现即使只添加了一次事件,小部件也会以相同的状态重建 2 次(例如 GetFinished),因此显示了 2 个模态。

任何帮助,将不胜感激。

谢谢

4

1 回答 1

0

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

1 - 让你的 statefull 小部件在 initState 上监听 bloc.stream(记得在 dispose 时取消订阅)

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();
  }
}

正如你所看到的,我说的只是流,没有使用任何外部的第三个包。

这应该可以正常工作

于 2020-02-28T11:59:41.587 回答