Flutter 在颤振状态下,将脚手架主体的动态数据传递给导航抽屉(使用抽屉作为侧板)
我正在开发一个计数器应用程序,它支持多个计数器。因为颤振不提供侧页模式,所以我使用导航抽屉作为侧页 我有一个架子,架子上有一排卡片。这些卡各有一个名称和计数器值。无论何时点击其中一张卡,导航抽屉都会打开,并显示此人的姓名和计数值。在该抽屉中,还有一个按钮,用于增加与单击的卡对应的计数器值。但是,问题是,如何将数据从脚手架主体传递到抽屉?我可以使用Flutter 在颤振状态下,将脚手架主体的动态数据传递给导航抽屉(使用抽屉作为侧板),flutter,dart,Flutter,Dart,我正在开发一个计数器应用程序,它支持多个计数器。因为颤振不提供侧页模式,所以我使用导航抽屉作为侧页 我有一个架子,架子上有一排卡片。这些卡各有一个名称和计数器值。无论何时点击其中一张卡,导航抽屉都会打开,并显示此人的姓名和计数值。在该抽屉中,还有一个按钮,用于增加与单击的卡对应的计数器值。但是,问题是,如何将数据从脚手架主体传递到抽屉?我可以使用Scaffold.of(context).openEndDrawer()以编程方式打开抽屉但这不允许我向其传递数据 我也可以使用下面的代码,它确实允许我
Scaffold.of(context).openEndDrawer()以编程方式打开抽屉代码>但这不允许我向其传递数据
我也可以使用下面的代码,它确实允许我传递数据,但随后抽屉像一页一样打开,覆盖了整个屏幕
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TurfDrawer(name: name, count: count)
));
所以基本上,我只想知道哪张卡被点击了,然后把它传给抽屉。非常感谢您的帮助
脚手架看起来像这样:
@override
Widget build(BuildContext context) {
return Scaffold(
// App bar
appBar: AppBar(
title: Text('Turflijst'),
elevation: 0.0,
automaticallyImplyLeading: false,
actions: <Widget>[
IconButton(icon: Icon(Icons.settings), onPressed: null)
],
),
// Drawer
endDrawer: TurfDrawer(),
// Body
body: Builder(
builder: (BuildContext context) {
return Stack(
alignment: AlignmentDirectional.topCenter,
children: <Widget> [
Container(
color: primaryColor,
height: (kEffectHeight - offset * 2.5).clamp(0.0, kEffectHeight),
),
Positioned(
child: Container(
margin: EdgeInsets.only(top: 70),
width: 1200.0,
child: GridView.count(
controller: scrollController,
crossAxisCount: 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 2,
children: <Widget>[
for (MapEntry entry in list.asMap().entries)
TurfCard(index: entry.key, name: entry.value, count: count[entry.key])
]
@覆盖
小部件构建(构建上下文){
返回脚手架(
//应用程序栏
appBar:appBar(
标题:文本(“TURPLIJST”),
标高:0.0,
自动嵌入:false,
行动:[
图标按钮(图标:图标(Icons.settings),ON按下:null)
],
),
//抽屉
endDrawer:Drawer(),
//身体
车身:建造商(
生成器:(BuildContext上下文){
返回堆栈(
对齐:对齐方向.topCenter,
儿童:[
容器(
颜色:原色,
高度:(kEffectHeight-偏移量*2.5)。夹具(0.0,kEffectHeight),
),
定位(
子:容器(
页边距:仅限边缘集(顶部:70),
宽度:1200.0,
子项:GridView.count(
控制器:滚动控制器,
交叉轴计数:4,
横轴间距:10,
平均间距:10,
儿童方面:2,
儿童:[
for(list.asMap().entries中的映射条目)
卡片(索引:entry.key,名称:entry.value,计数:count[entry.key])
]
这是卡片:
class TurfCard extends StatefulWidget {
final int index, count;
final String name;
TurfCard({
Key key,
@required this.index,
@required this.name,
@required this.count
}) : super(key: key);
@override
_TurfCardState createState() => _TurfCardState();
}
class _TurfCardState extends State<TurfCard> {
@override
Widget build (BuildContext context) {
return GridTile(
child: Card(
elevation: 1.5,
color: Colors.white,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.0)),
child: InkWell(
splashColor: primaryColor.withAlpha(100),
onTap: () {
Scaffold.of(context).openEndDrawer();
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => TurfDrawer()
// ));
print('Card $widget.index tapped.');
},
类TurbCard扩展StatefulWidget{
最终整数索引,计数;
最后的字符串名;
草皮卡({
关键点,
@需要这个索引,
@需要此名称,
@需要这个。计数
}):super(key:key);
@凌驾
_TurbCardState createState()=>\u TurbCardState();
}
类(状态扩展状态){
@凌驾
小部件构建(构建上下文){
返回网格(
孩子:卡片(
标高:1.5,
颜色:颜色,白色,
形状:RoundedRectangleBorder(borderRadius:borderRadius.circular(15.0)),
孩子:InkWell(
splashColor:primaryColor.带有Alpha(100),
onTap:(){
Scaffold.of(context.openEndDrawer();
//导航器。推(
//背景,
//材料路线(
//生成器:(上下文)=>purpdrawer()
// ));
打印('Card$widget.index.');
},
这是一种解决方案:
将所选索引保存为ScaffoldWidget类中的字段(无论您如何称呼它):
类TurbCard扩展StatefulWidget{
最终的void函数()onTap;
//……其他财产
}
类(状态扩展状态){
@凌驾
小部件构建(构建上下文){
返回一些小部件(
孩子:InkWell(
//...
onTap:widget.onTap,
),
);
}
}
类主页扩展了无状态小部件{
int selectedIndex;//您还可以在此处保存索引并在onTap()中更新它
@凌驾
小部件构建(构建上下文){
返回小部件构建(构建上下文){
返回脚手架(
//...
body:SomeWidgets(
//...
for(list.asMap().entries中的映射条目)
草皮卡(
//一些财产。。。。
onTap:(){
selectedIndex=entry.key;
Scaffold.of(context.openEndDrawer();
打印('Card${entry.key tapped');
}
)
),
),
};
}
}
这是一种解决方案:
将所选索引保存为ScaffoldWidget类中的字段(无论您如何称呼它):
类TurbCard扩展StatefulWidget{
最终的void函数()onTap;
//……其他财产
}
类(状态扩展状态){
@凌驾
小部件构建(构建上下文){
返回一些小部件(
孩子:InkWell(
//...
onTap:widget.onTap,
),
);
}
}
类主页扩展了无状态小部件{
int selectedIndex;//您还可以在此处保存索引并在onTap()中更新它
@凌驾
小部件构建(构建上下文){
返回小部件构建(构建上下文){
返回脚手架(
//...
body:SomeWidgets(
//...
for(list.asMap().entries中的映射条目)
草皮卡(
//一些财产。。。。
onTap:(){
selectedIndex=entry.key;
Scaffold.of(context.openEndDrawer();
打印('Card${entry.key tapped');
}
)
),
),
};
}
}
最后,我使用提供程序包中的ChangeNotifier解决了这个问题。每当单击一张卡时,ChangeNotifier中的值都会更新并更新其侦听器。然后抽屉会侦听这个ChangeNotifier。最后,我使用提供程序包中的ChangeNotifier解决了这个问题。每当单击一张卡时,valChangeNotifier中的ue被更新并更新其列表
class TurfCard extends StatefulWidget {
final void Function() onTap;
//...other properties
}
class _TurfCardState extends State<TurfCard> {
@override
Widget build(BuildContext context) {
return SomeWidgets(
child: InkWell(
//...
onTap: widget.onTap,
),
);
}
}
class HomePage extends StatelessWidget {
int selectedIndex; //you can also save the index here and update it in onTap()
@override
Widget build(BuildContext context) {
return Widget build(BuildContext context){
return Scaffold(
//...
body: SomeWidgets(
//...
for(MapEntry entry in list.asMap().entries)
TurfCard(
//some properties....
onTap:(){
selectedIndex = entry.key;
Scaffold.of(context).openEndDrawer();
print('Card ${entry.key tapped.');
}
)
),
),
};
}
}