带有 child 个选项卡的 Flutter Appbar(操作)
Flutter Appbar (actions) with child tabs
我是 Flutter 的新手,我想知道您是否可以帮助我找到解决问题的方法。
我有一个带有选项卡视图的脚手架,我想在主应用栏中创建一个过滤器(操作按钮)来管理选项卡。
main 和 child 都是 StatefulWidgets
这是我的主页代码:
Widget body = TabBarView(
controller: tabController,
children: <Widget>[
new First(filter: filter),
new Second(filter: filter);
new Third(filter: filter);
],
);
return Scaffold(
appBar: AppBar(
actions:[IconButton(icon: Icon(MdiIcons.filter),onPressed:
() {
// Send info to child
})],
bottom: new TabBar(
controller: tabController,
tabs: <Tab>[
new Tab(text:"Tab1"),
new Tab(text:"Tab2"),
new Tab(text:"Tab3")
],
body: new Builder(builder: (BuildContext context) {
_scaffoldContext = context;
return body;
}));
));
Children 页数:
Widget body = Text("Filter name here");
return Scaffold(
body:
new Builder(
builder: (context) {
snack = new DisplaySnackBar(context: context);
return body;
}),
);
}
我不知道将 appbar 的操作放在哪里,使 child 正文中的文本从主页更改。
我找到了解决方案,方法是将我的 parent 小部件设为 InheritedWidget,这样我就可以从 child.
访问它的数据
这是一个例子:
class MyStatefulWidget extends StatefulWidget{
@override
MyStatefulWidgetState createState() => MyStatefulWidgetState();
static MyStatefulWidgetState of(BuildContext context){
return (context.inheritFromWidgetOfExactType(_MyInheritedStateContainer) as _MyInheritedStateContainer).data;
}
}
class MyStatefulWidgetState extends State<MyStatefulWidget>{
String variableCalledHello = "Hello World";
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return new _MyInheritedStateContainer(data:this,child:/* Body here */);
}
}
class _MyInheritedStateContainer extends InheritedWidget{
_MyInheritedStateContainer({
Key key,
@required Widget child,
@required this.data,
}) : super(key: key, child: child);
final MyStatefulWidgetState data;
@override
bool updateShouldNotify(_MyInheritedStateContainer oldWidget) {
return true;
}
}
并且对于每个 child :
你只需要打电话 MyStatefulWidgetState state = MyStatefulWidgetState.of(context);
示例:
@override
Widget build(BuildContext context) {
MyStatefulWidgetState state = MyStatefulWidgetState.of(context);
print(state.variableCalledHello);
return /* Container ... */;
}
希望能帮助某人解决他的问题。
谢谢。
我是 Flutter 的新手,我想知道您是否可以帮助我找到解决问题的方法。
我有一个带有选项卡视图的脚手架,我想在主应用栏中创建一个过滤器(操作按钮)来管理选项卡。
main 和 child 都是 StatefulWidgets
这是我的主页代码:
Widget body = TabBarView(
controller: tabController,
children: <Widget>[
new First(filter: filter),
new Second(filter: filter);
new Third(filter: filter);
],
);
return Scaffold(
appBar: AppBar(
actions:[IconButton(icon: Icon(MdiIcons.filter),onPressed:
() {
// Send info to child
})],
bottom: new TabBar(
controller: tabController,
tabs: <Tab>[
new Tab(text:"Tab1"),
new Tab(text:"Tab2"),
new Tab(text:"Tab3")
],
body: new Builder(builder: (BuildContext context) {
_scaffoldContext = context;
return body;
}));
));
Children 页数:
Widget body = Text("Filter name here");
return Scaffold(
body:
new Builder(
builder: (context) {
snack = new DisplaySnackBar(context: context);
return body;
}),
);
}
我不知道将 appbar 的操作放在哪里,使 child 正文中的文本从主页更改。
我找到了解决方案,方法是将我的 parent 小部件设为 InheritedWidget,这样我就可以从 child.
访问它的数据这是一个例子:
class MyStatefulWidget extends StatefulWidget{
@override
MyStatefulWidgetState createState() => MyStatefulWidgetState();
static MyStatefulWidgetState of(BuildContext context){
return (context.inheritFromWidgetOfExactType(_MyInheritedStateContainer) as _MyInheritedStateContainer).data;
}
}
class MyStatefulWidgetState extends State<MyStatefulWidget>{
String variableCalledHello = "Hello World";
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return new _MyInheritedStateContainer(data:this,child:/* Body here */);
}
}
class _MyInheritedStateContainer extends InheritedWidget{
_MyInheritedStateContainer({
Key key,
@required Widget child,
@required this.data,
}) : super(key: key, child: child);
final MyStatefulWidgetState data;
@override
bool updateShouldNotify(_MyInheritedStateContainer oldWidget) {
return true;
}
}
并且对于每个 child :
你只需要打电话 MyStatefulWidgetState state = MyStatefulWidgetState.of(context);
示例:
@override
Widget build(BuildContext context) {
MyStatefulWidgetState state = MyStatefulWidgetState.of(context);
print(state.variableCalledHello);
return /* Container ... */;
}
希望能帮助某人解决他的问题。
谢谢。