Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在颤振状态下,将脚手架主体的动态数据传递给导航抽屉(使用抽屉作为侧板)_Flutter_Dart - Fatal编程技术网

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.');
               }
           )
        ),
      ),
    };
  }
}