Aya*_*isy 5 parameter-passing scaffold floating-action-button flutter
在此小部件中,如果有问题,选项卡会在类型之间导航,它会进入指定的屏幕。如果是论坛,则会转到另一个论坛。问题是我需要将当前点击的类型传递给浮动操作按钮中的按下功能。然而浮动操作按钮位于脚手架主体之外。有没有办法将值传递给浮动操作按钮?
class TabScreen extends StatelessWidget {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState();
@override
Widget build(BuildContext context) {
final bool showfab = MediaQuery.of(context).viewInsets.bottom == 0.0;
final AuthService authService = Provider.of<AuthService>(context);
return StreamBuilder<List<String>>(
stream: forumServices.forumsTypes$,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
List<String> types = snapshot.data;
num tabLen = types.length;
return DefaultTabController(
length: tabLen,
child: Scaffold(
key: _scaffoldKey,
body: CustomScrollView(slivers: <Widget>[
SliverAppBar(
title: Text("kdkdkkd"),
bottom: TabBar(
tabs: types.map((String f) {
return Text(f);
}).toList()),
),
SliverFillRemaining(
child: StreamBuilder<List<Forums>>(
stream: forumServices.forums$,
builder: (context, snap) {
if (!snap.hasData) {
return CircularProgressIndicator();
}
final forum = snap.data;
return TabBarView(
children: types.map((String type) {
List<Forums> listofthistype =
forum.where((Forums fo) {
return fo.type == type;
}).toList();
final cards = listofthistype
.map((thistype) => ForumCard(
choosentype: thistype,
forumServices: forumServices,
))
.toList();
return ListView(
children: cards,
);
}).toList(),
);
}),
),
]),
floatingActionButton:
FloatingActionButton(
onPressed: () => _showBottom(),
tooltip: 'Increment',
child: Icon(Icons.add),
)
));
});
Run Code Online (Sandbox Code Playgroud)
class Screen extends StatelessWidget {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final GlobalKey<TabsWidgetState> _tabKey = GlobalKey<TabsWidgetState>();
@override
Widget build(BuildContext context) {
return FutureBuilder<List<String>>(
future: Future.delayed(
const Duration(seconds: 1), () => ["Forum", "Question"]),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
List<String> types = snapshot.data;
num tabLen = types.length;
return Scaffold(
key: _scaffoldKey,
body: TabsWidget(key: _tabKey, tabLen: tabLen, types: types),
floatingActionButton: FloatingActionButton(
onPressed: () => print(_tabKey.currentState.currentQuestion),
tooltip: 'Increment',
child: Icon(Icons.add),
));
});
}
}
class TabsWidget extends StatefulWidget {
const TabsWidget({
Key key,
@required this.tabLen,
@required this.types,
}) : super(key: key);
final num tabLen;
final List<String> types;
@override
TabsWidgetState createState() => TabsWidgetState();
}
class TabsWidgetState extends State<TabsWidget> with SingleTickerProviderStateMixin{
TabController _tabController;
String currentQuestion;
@override
void initState() {
_tabController = TabController(length: widget.tabLen, vsync: this)
..addListener(() {
currentQuestion = widget.types[_tabController.index];
});
}
@override
Widget build(BuildContext context) {
return CustomScrollView(slivers: <Widget>[
SliverAppBar(
title: Text("kdkdkkd"),
bottom: TabBar(
controller: _tabController,
tabs: widget.types.map((String f) {
return Text(f);
}).toList()),
),
SliverFillRemaining(
child: FutureBuilder(
future: Future.delayed(const Duration(seconds: 1),
() => ["Forum", "Question"]),
builder: (context, snap) {
if (!snap.hasData) {
return CircularProgressIndicator();
}
final forum = snap.data;
return TabBarView(
controller: _tabController,
children: widget.types.map((String type) {
List<String> listofthistype =
forum.where((String fo) {
return fo == type;
}).toList();
final cards = listofthistype
.map((thistype) => Text(thistype))
.toList();
return ListView(
children: cards,
);
}).toList(),
);
}),
),
]);
}
}
Run Code Online (Sandbox Code Playgroud)
为了简单起见,使用 futureBuilder 如果您的选项卡长度没有从快照加载,您可以避免使用全局键,而只需在开始时创建选项卡控制器。
不要忘记进行空检查。Fab 将在数据加载之前显示。
归档时间: |
|
查看次数: |
2509 次 |
最近记录: |