Flutter 将值传递给浮动操作按钮以在底部工作表中使用
在这个小部件中,标签在类型之间导航,如果它进入指定的屏幕。如果是论坛,则转到另一个论坛。问题是我需要将当前点击的类型传递给浮动操作按钮中的on pressed(打开)功能。但是,浮动动作按钮位于脚手架主体外部。是否有方法将值传递给浮动操作按钮Flutter 将值传递给浮动操作按钮以在底部工作表中使用,flutter,parameter-passing,floating-action-button,scaffold,Flutter,Parameter Passing,Floating Action Button,Scaffold,在这个小部件中,标签在类型之间导航,如果它进入指定的屏幕。如果是论坛,则转到另一个论坛。问题是我需要将当前点击的类型传递给浮动操作按钮中的on pressed(打开)功能。但是,浮动动作按钮位于脚手架主体外部。是否有方法将值传递给浮动操作按钮 class TabScreen extends StatelessWidget { final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState
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),
)
));
});
类TabScreen扩展了无状态小部件{
最终GlobalKey _scaffoldKey=新的GlobalKey ForumCard(
选择类型:此类型,
论坛服务:论坛服务,
))
.toList();
返回列表视图(
孩子们:卡片,
);
}).toList(),
);
}),
),
]),
浮动操作按钮:
浮动操作按钮(
按下时:()=>\u showBottom(),
工具提示:“增量”,
子:图标(Icons.add),
)
));
});
类屏幕扩展小部件{
最终GlobalKey _scaffoldKey=GlobalKey();
最后一个GlobalKey _tabKey=GlobalKey();
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:future.delayed(
持续时间(秒:1),()=>[“论坛”,“问题]),
生成器:(上下文,快照){
如果(!snapshot.hasData){
返回循环ProgressIndicator();
}
列表类型=snapshot.data;
num tabLen=types.length;
返回脚手架(
钥匙:_scaffoldKey,
正文:TabsWidget(键:_tabKey,tabLen:tabLen,type:types),
浮动操作按钮:浮动操作按钮(
按下:()=>打印(_tabKey.currentState.currentQuestion),
工具提示:“增量”,
子:图标(Icons.add),
));
});
}
}
类TabsWidget扩展StatefulWidget{
康斯特塔布斯威吉特酒店({
关键点,
@需要这个表,
@需要此类型,
}):super(key:key);
最终数字表;
最终清单类型;
@凌驾
TabsWidgetState createState()=>TabsWidgetState();
}
类TabsWidgetState使用SingleTickerProviderStateMixin扩展状态{
TabController\u TabController;
字符串问题;
@凌驾
void initState(){
_tabController=tabController(长度:widget.tabLen,vsync:this)
…addListener(){
currentQuestion=widget.types[_tabController.index];
});
}
@凌驾
小部件构建(构建上下文){
返回自定义滚动视图(条子:[
滑杆(
标题:文本(“KDKKD”),
底部:选项卡栏(
控制器:\ tab控制器,
选项卡:widget.types.map((字符串f){
返回文本(f);
}).toList()),
),
剩余碎片(
孩子:未来建设者(
未来:未来。延迟(持续时间(秒:1),
()=>[“论坛”,“问题]),
生成器:(上下文,捕捉){
如果(!snap.hasData){
返回循环ProgressIndicator();
}
最终论坛=snap.data;
返回选项卡视图(
控制器:\ tab控制器,
子项:widget.types.map((字符串类型){
此类型的列表=
论坛。其中((字符串fo){
返回fo==type;
}).toList();
最终卡片=列表类型
.map((此类型)=>文本(此类型))
.toList();
返回列表视图(
孩子们:卡片,
);
}).toList(),
);
}),
),
]);
}
}
为了简单起见,请使用futureBuilder
如果您的选项卡长度不是从快照加载的,您可以避免使用全局键,只需在一开始创建选项卡控制器
别忘了做空检查。Fab将在加载数据之前显示。删除
DefaultTabController
小部件并创建自己的TabController
——这允许您向TabController
添加侦听器,用户每次导航到不同的选项卡时都会触发该侦听器。可以使用此机制获取与当前选项卡的索引关联的数据,例如类型
这是您提供的代码,以及我上面提到的修改。该类型存储在currentType
变量中,您可以在点击Fab时使用该变量
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class TabScreen extends StatefulWidget {
@override
_TabScreenState createState() => _TabScreenState();
}
class _TabScreenState extends State<TabScreen> with SingleTickerProviderStateMixin {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TabController tabController;
String currentType;
@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 const CircularProgressIndicator();
}
List<String> types = snapshot.data;
if (tabController == null) {
currentType = types.first;
tabController = TabController(length: types.length, vsync: this);
tabController.addListener(() {
currentType = types.elementAt(tabController.index);
});
}
return Scaffold(
key: _scaffoldKey,
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: const Text("kdkdkkd"),
bottom: TabBar(
controller: tabController,
tabs: types.map((String f) => Text(f)).toList()),
),
SliverFillRemaining(
child: StreamBuilder<List<Forums>>(
stream: forumServices.forums$,
builder: (context, snap) {
if (!snap.hasData) {
return const CircularProgressIndicator();
}
final forum = snap.data;
return TabBarView(
controller: tabController,
children: types.map((String type) {
List<Forums> listOfThisType = forum.where((Forums fo) => fo.type == type).toList();
return ListView(
children: listOfThisType.map((thisType) => ForumCard(
choosentype: thisType,
forumServices: forumServices,
)).toList(),
);
}).toList(),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () => _showBottom(),
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
},
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
类TabScreen扩展StatefulWidget{
@凌驾
_TabScreenState createState()=>TabScreenState();
}
类_TabScreenState使用SingleTickerProviderStateMixin扩展状态{
最终GlobalKey _scaffoldKey=GlobalKey();
TabController TabController;
字符串类型;
@凌驾
小部件构建(构建上下文){
final bool showfab=MediaQuery.of(context.viewInsets.bottom==0.0;
最终AuthService AuthService=Provider.of(上下文);
返回流生成器(
流:forumServices.forumsTypes$,
生成器:(上下文,快照){
如果(!snapshot.hasData){
return const CircularProgressIndicator();
}
列表类型=snapshot.data;
if(tabController==null){
currentType=types.first;
tabController=tabController(长度:types.length,vsync:this);
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class TabScreen extends StatefulWidget {
@override
_TabScreenState createState() => _TabScreenState();
}
class _TabScreenState extends State<TabScreen> with SingleTickerProviderStateMixin {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TabController tabController;
String currentType;
@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 const CircularProgressIndicator();
}
List<String> types = snapshot.data;
if (tabController == null) {
currentType = types.first;
tabController = TabController(length: types.length, vsync: this);
tabController.addListener(() {
currentType = types.elementAt(tabController.index);
});
}
return Scaffold(
key: _scaffoldKey,
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: const Text("kdkdkkd"),
bottom: TabBar(
controller: tabController,
tabs: types.map((String f) => Text(f)).toList()),
),
SliverFillRemaining(
child: StreamBuilder<List<Forums>>(
stream: forumServices.forums$,
builder: (context, snap) {
if (!snap.hasData) {
return const CircularProgressIndicator();
}
final forum = snap.data;
return TabBarView(
controller: tabController,
children: types.map((String type) {
List<Forums> listOfThisType = forum.where((Forums fo) => fo.type == type).toList();
return ListView(
children: listOfThisType.map((thisType) => ForumCard(
choosentype: thisType,
forumServices: forumServices,
)).toList(),
);
}).toList(),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () => _showBottom(),
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
},
);
}
}