flutter - 如何在屏幕加载时只调用一次 bloc 事件

标签 flutter bloc

我正在使用 flutter_bloc图书馆。我的屏幕小部件代码看起来像这样:

class RegisterScreen extends StatefulWidget {
  RegisterScreen();

  @override
  _RegisterScreenState createState() => _RegisterScreenState();
}

class _RegisterScreenState extends State<RegisterScreen> {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<RegisterBloc>(
      create: (BuildContext context) {
        // RegisterBloc.get(context).add(RegisterGetCitiesEvent());<=== This gives me error `BlocProvider.of() called with a context that does not contain a Cubit of type RegisterBloc. \n No ancestor could be found starting from the context that was passed to BlocProvider.of<RegisterBloc>().`
        return RegisterBloc();
      },
      child: BlocConsumer<RegisterBloc, RegisterState>(
        listener: (BuildContext context, RegisterState state) {},
        builder: (BuildContext context, RegisterState state) {
          // RegisterBloc.get(context).add(RegisterGetCitiesEvent());<=== This line is executed infinite times
          return Scaffold(
            floatingActionButton: FloatingActionButton(
              onPressed: () {
                RegisterBloc.get(context).add(RegisterGetCitiesEvent());
              },
              child: new Icon(Icons.refresh),
            ),
            body: Conteiner(
              child: Text(RegisterBloc.get(context).cities==null?'':RegisterBloc.get(context).cities,)
            ),
          );
        },
      ),
    );
  }
}
bloc文件是这样的:
class RegisterBloc extends Bloc<RegisterEvent, RegisterState> {
  static RegisterBloc get(BuildContext context) => BlocProvider.of(context);
  RegisterBloc() : super(RegisterInitial());

  String cities = '';

  @override
  Stream<RegisterState> mapEventToState(
    RegisterEvent event,
  ) async* {
    if (event is RegisterGetCitiesEvent) {
      yield* getCities();
    }
  }

  Stream<RegisterGetCitiesState> getCities() async* {
    yield await (CustomerServer.getCities()).then((res) {
      cities = res;
      return RegisterGetCitiesState();
    });
  }
}
在我的代码中,我必须点击 FAB调用 RegisterGetCitiesEvent块事件。我怎样才能立即调用该事件 RegisterBloc.get(context).add(RegisterGetCitiesEvent())不需要用户点击任何按钮?
我试过的:
我试图在 BlocConsumer 中添加该行builder 函数,但该函数执行了无限次。
我试图在 BlocProvider 中添加该行创建函数,但它给了我一个错误 BlocProvider.of() called with a context that does not contain a Cubit of type RegisterBloc.我应该把这条线放在哪里RegisterBloc.get(context).add(RegisterGetCitiesEvent())调用RegisterGetCitiesEvent屏幕显示时自动事件(无需单击任何按钮)?

最佳答案

我建议你阅读 BLoC文件完整。但这里是这个问题的快速答案:你应该在 BlocProvider 中做到这一点。的创建功能。像这样:

class RegisterScreen extends StatefulWidget {
  RegisterScreen();

  @override
  _RegisterScreenState createState() => _RegisterScreenState();
}

class _RegisterScreenState extends State<RegisterScreen> {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<RegisterBloc>(
      create: (context) => RegisterBloc()..add(RegisterGetCitiesEvent())
    );
  }
}

关于flutter - 如何在屏幕加载时只调用一次 bloc 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63525376/

相关文章:

flutter dio(4.0.0) 处理 token 过期(处理401)

flutter - 抽象类不能被实例化!在身份验证 block 中

sockets - Flutter/Dart套接字通信,字符编码问题

flutter - 如何在Flutter中使用Bloc模式处理用户注册错误

flutter - 在 dispose 方法中访问 BlocProvider.of<Bloc>(context)

dart - Flutter - 如何让带有 child 的容器占据整个屏幕

firebase - 使用 Bloc、RxDart 和 Flutter 创建用户个人资料页面

flutter - 如何更改饼图中的图例图标,我正在使用Charts_flutter 0.9.0

flutter - 自定义 Flutter 小部件以返回两个小部件以与 CustomScrollView/slivers 一起使用

ios - 如何以 bgra8Unorm 像素格式绘制 MTLTexture