【问题标题】:flutter_bloc subwidget closes the bloc of the parent widgetflutter_bloc 子小部件关闭父小部件的块
【发布时间】:2020-05-22 17:00:39
【问题描述】:

我正在使用 flutter_bloc 包。

我有一个带有标签栏的页面。 该页面创建一个块并将其提供给用作选项卡内容的小部件。

class _MyScreenState extends State<MyScreen> {
  MyBloc _myBloc;
  ...

  Widget _buildTabBar() {
  ...

    var children = [
    _buildFirstTab()
    _buildSecondTab(),
    ];

    return WillPopScope(
      onWillPop: _onWillPop,
      child: DefaultTabController(
      length: children.length,
      child: Scaffold(
        appBar: PreferredSize(
            preferredSize: Size.fromHeight(75.0),
            child: AppBar(
              bottom: TabBar(isScrollable: true, tabs: tabs),
            )),
        body: TabBarView(
          children: children,
        ),
      ),
    ),
  );
  }
..
}

Widget _buildSecondTab() {
  if (_myBloc == null) {
    _myBloc = MyBloc(<..initialdata..>);
  }
  _myBloc.add(LoadServerDataEvent());

  return BlocProvider<MyBloc>(create: (_) => _myBloc, child: SecondTab());
}

第二个选项卡上的小部件从 BlocProvider 获取块并使用它。

class _SecondTabState extends State<SecondTab> {
  MyBloc _myBloc;

  @override
  void initState() {
    _myBloc = BlocProvider.of<MyBloc>(context);
    super.initState();
  }

我的问题是,当我在选项卡之间切换时,该块会自动关闭。

这有点奇怪,因为该块仍然在页面上使用。

【问题讨论】:

    标签: flutter bloc flutter-bloc


    【解决方案1】:

    好吧,你做错了几件事:

    1. 如果您希望bloc 在第一个和第二个选项卡中都可以访问,您应该用它包裹整个选项卡栏,
    2. 很奇怪,你在 _MyScreenState 中保留了一个 bloc 的实例,并用惰性初始化单音if (_myBloc == null) _myBloc = MyBloc() 做一些魔术,
    3. _myBloc.add(LoadServerDataEvent()); 在大多数情况下应该在_SecondTabStateinitState 方法中触发。
    4. bloc 从 UI 获取初始数据是非常不寻常的。如果您想使用blocs 构建您的架构,那么这个初始数据应该来自另一个bloc

    但是,如果您想为第二个选项卡提供现有的 bloc 并防止它被关闭,您应该使用:

    BlocProvider.value(
      value: _myBloc,
      child: SecondTab(),
    );
    

    改为:

    BlocProvider<MyBloc>(create: (_) => _myBloc, child: SecondTab());
    

    【讨论】:

    • 您好,感谢您的回复。 1. 2. 那是一些旧代码。在第一个实现中,我有 2 个块,第二个需要来自第一个的一些数据。这是一个愚蠢的实现。我纠正了它。 3. 好的,谢谢。 4. 我在整个应用程序中没有块。在这种情况下,屏幕会获得一个不是来自块的 ID。这个块需要ID来加载数据。
    猜你喜欢
    • 2020-01-01
    • 2019-09-08
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2019-01-14
    相关资源
    最近更新 更多