Flutter:如何在控制器中触发块事件?

2024-01-31

总之,我希望“context.read().add(EnabledEvent())”能够从控制器本身或我可以用来从控制器触发事件​​并更新状态的其他替代方案工作:

class SplashCtrl extends GetxController {

  @override
  void onReady() {
    User user = loadUser();
    if (user.isExampleEnabled) {
      context.read<ExampleBloc>().add(EnabledEvent());
    }
  }

我尝试的另一件事是:

ExampleBloc testBloc = ExampleBloc();
testBloc.add(TestEvent());

在控制器中,它似乎确实触发了事件,但 UI 不会随着状态更改而更新。我似乎真的需要上下文来改变这一点。有任何想法吗?

更多细节和背景:

我想不仅在页面本身中触发块事件,而且在页面的控制器中触发块事件!

因此,我的 flutter 应用程序中有页面,每个视图都有一个控制器,如下所示:

class SplashPage extends GetView<SplashCtrl> {
  @override
  Widget build(BuildContext context) {
    Get.lazyPut(() => SplashCtrl());
    return Scaffold(...);
  }
}

SplashCtrl 是该页面的控制器。此启动视图页面是加载并准备就绪(基本上立即)时运行功能的第一个页面之一,例如检查用户是否登录并将其数据加载到应用程序,如下所示:

class SplashCtrl extends GetxController {

  @override
  void onReady() {
    // run stuff here
  }

我已经能够在页面中创建 lambda 函数并根据它们的功能触发事件,并像这样进行切换:


IconSwitchedButtonUi(
  value: state.isExampleOn,
  icon: Images.toggleIcon,
  title: "Is Example enabled?",
  onChanged: (value) {
  if (value) {
    context.read<ExampleBloc>().add(EnabledEvent());
    } else {
    context.read<ExampleBloc>().add(DisabledEvent());
    }
  },
),

但现在,如果用户的某个字段具有特定值,我需要一个 bloc 事件来触发并稍微更改状态。我怎么做?如何从控制器内触发事件? “context.read”不起作用,因为控制器没有上下文,或者有吗?


ExampleBloc testBloc = ExampleBloc(); testBloc.add(TestEvent());

这不起作用,因为您正在声明未通过任何连接连接的全新的 bloc 实例BlocProvider到你的小部件树,因此你无法触发this会发出状态的块事件BlocBuilder可以做出反应。由于没有向小部件树提供块read()不会找到这个集团。

为了完成这项工作,您需要:

Pass BuildContext有一些 Bloc 或 Cubit 提供BlocProvider
void foo(BuildContext context) {
  User user = loadUser();
  if (user.isExampleEnabled) {
    context.read<ExampleBloc>().add(EnabledEvent());
  }
}
..或直接在控制器内监听块更改
class SplashCtrl extends GetxController {
  SplashCtrl(MyBloc bloc) {
    bloc.stream.listen((event) {
    // React to bloc changes here
    if (event is MyBlocEvent) {
      // Do something
      }
    }
  }
}

请记住,即使在这种方法中,块实例也给出了SplashCrtl构造函数必须相同这是由提供的BlocProvider到一个小部件树才能使其工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:如何在控制器中触发块事件? 的相关文章

随机推荐