我正在使用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();
}
我的问题是,当我在选项卡之间切换时,该块会自动关闭。
这有点奇怪,因为该块仍在页面上使用。
答案 0 :(得分:0)
好吧,您做错了几件事:
bloc
,则应该用它包装整个标签栏,_MyScreenState
中保留了一个bloc的实例,并用惰性初始化singeltone if (_myBloc == null) _myBloc = MyBloc()
做了一些魔术,_myBloc.add(LoadServerDataEvent());
的{{1}}方法触发initState
。_SecondTabState
从UI中获取初始数据非常少见。如果要使用bloc
构建体系结构,则此初始数据应来自另一个blocs
。但是,如果要向第二个标签提供现有的bloc
并防止其被关闭,则应使用:
bloc
相反:
BlocProvider.value(
value: _myBloc,
child: SecondTab(),
);