如何抵消Flutter中的脚手架小部件?

Nir*_*yer 5 navigation android offset dart flutter

我是个新手。我想设计一个自定义的导航窗口,如下所示。

在此处输入图片说明

我计划要做的是:

  1. 创建我的导航小部件
  2. 创建我的新闻提要小部件
  3. 堆叠两个小部件(导航上方的新闻提要)
  4. 如果单击菜单图标,则将新闻提要小部件转换为某个值,以使下面的导航小部件可见

我做了前3个步骤。我对第四个有问题。我设置了一个偏移状态变量,并将脚手架小部件放置在“位置”小部件中。我将Positioned类的“左侧”设置为Offset.dx。

码:

    导入'package:flutter / material.dart';
    导入'package:flutter / animation.dart';

    void main()=> runApp(新的MyApp());

    MyApp类扩展StatelessWidget {
      @override
      小部件build(BuildContext context){
        返回新的MaterialApp(
            标题:“ Flutter演示”,
            主题:新的ThemeData(
                primarySwatch:const MaterialColor(0xfff06000,const {
                  50:const Color(0xfffff0e6),
                  100:const Color(0xffffd1b3),
                  200:const Color(0xffffb380),
                  300:const Color(0xffff944d),
                  400:常量颜色(0xffff751a),
                  500:常量颜色(0xfff06000),
                  600:常量颜色(0xffcc5200),
                  700:常量颜色(0xffb34700),
                  800:常量颜色(0xff993d00),
                  900:常量颜色(0xff662900),
                })),
            //我堆叠课程
            主页:新堆栈(
              儿童:[
                新的MyNavPage(),
                new MyHomePage(title:“ Home”,initialOffset:new Offset(0.0,0.0),),
              ],
            )
        );
      }
    }

    //这是我的新闻提要课程

    类MyHomePage扩展了StatefulWidget {

      最终的字符串标题;
      最终偏移量initialOffset;

      MyHomePage({Key key,this.title,this.initialOffset}):super(key:key);

      @override
      _MyHomePageState createState()=>新的_MyHomePageState();
    }

    _MyHomePageState类使用TickerProviderStateMixin扩展了状态{

      偏移位置=新的偏移(0.0,0.0);

      int _counter = 0;

      void _incrementCounter(){
        setState((){
          _counter ++;
        });
      }

      无效的initState(){
        super.initState();
        位置= widget.initialOffset;
      }

      @override
      小部件build(BuildContext context){

        最终脚手架=新脚手架(
          主要:是的,
          appBar:新的AppBar(
            标题:new Text(widget.title),
            centerTitle:正确,
            领先:新IconButton(图标:新Icon(Icons.menu),onPressed:()=> setState(()=> position = new Offset(100.0,0.0)),),
          ),
          backgroundColor:Colors.white30,
          正文:新容器(
            孩子:新中心(
              子级:新列(
                mainAxisAlignment:MainAxisAlignment.center,
                儿童:[
                  新文字(
                    “您已经多次按下按钮:”,
                  ),
                  新文字(
                    '$ _counter',
                    风格:主题
                        .of(上下文)
                        .text主题
                        .display1,
                  ),
                ],
              ),
            ),
          ),
          floatActionButton:新的FloatingActionButton(
            onPressed:_incrementCounter,
            工具提示:“增量”,
            子级:new Icon(Icons.add),
          ),
        );

        返回新的Positioned(
          左:position.dx,
          孩子:脚手架,
        );
      }

    }

    //我的导航类。它的导航选项在左侧为一列。
    //宽度为100.0,因此我的首页偏移了100.0 


    类MyNavPage扩展StatefulWidget {
      MyNavPage({Key key}):超级(key:key);

      @override
      _MyNavPageState createState()=>新的_MyNavPageState();
    }

    _MyNavPageState类扩展了状态{

      @override
      小部件build(BuildContext context){
        展开的createNavChild(I i,文字t){
          返回新的Expanded(
            子:new GestureDetector(
              子代:新容器(
                宽度:100.0,
                装饰:新的BoxDecoration(颜色:Colors.red,),
                子:新列(
                  mainAxisAlignment:MainAxisAlignment.center,
                  mainAxisSize:MainAxisSize.min,
                  儿童:[
                    一世,
                    Ť
                  ],
                ),
              ),
            ),
          );
        }

        返回新的脚手架(
          主要:是的,
          正文:新容器(
            边距:MediaQuery
                .of(上下文)
                。填充,
            子级:新列(
              crossAxisAlignment:CrossAxisAlignment.start,
              儿童:[
                createNavChild(new Icon(Icons.home,size:30.0),new Text(“ Home”)),
                createNavChild(
                    新Icon(Icons.person_add,大小:30.0),新Text(“ Register”)),
                createNavChild(
                    新的Icon(Icons.search,大小:30.0),新的Text(“ Player Search”)),
                createNavChild(
                    新的Icon(Icons.event,大小:30.0),新的Text(“ Events”)),
                createNavChild(new Icon(Icons.file_download,size:30.0),
                    新文本(“下载”)),
                createNavChild(
                    新图标(Icons.call,大小:30.0),新文本(“联系人”)),
              ],
            ),
            装饰:新的BoxDecoration(颜色:Colors.transparent,),
          ),
        );
      }
    }

引发错误:

I /颤振(3090):??? 渲染库导致的例外情况??????????????????????????????????????????????????? ?????????????
I / flutter(3090):在performLayout()期间引发了以下断言:
I / flutter(3090):在布局过程中为RenderCustomMultiChildLayoutBox对象赋予了无限大小。
I / flutter(3090):这可能意味着它是一个试图尽可能大的渲染对象,但是它被放置
I / flutter(3090):在另一个渲染对象中,该对象允许其子代选择自己的大小。
I / flutter(3090):提供无限宽度约束的最接近的祖先是:
I / flutter(3090):RenderStack#df1fd NEEDS-LAYOUT NEEDS-PAINT
I / flutter(3090):创建者:堆栈?语义学?建造者?RepaintBoundary- [GlobalKey#274fe]?忽略指针?
I / flutter(3090):FadeTransition吗?小数翻译?SlideTransition?_MountainViewPageTransition?
I / flutter(3090):AnimatedBuilder吗?RepaintBoundary?_FocusScopeMarker??
I / Flutter(3090):parentData:(可以使用大小)
I / flutter(3090):约束条件:BoxConstraints(w = 360.0,h = 640.0)
I / Flutter(3090):大小:大小(360.0,640.0)
I / Flutter(3090):对齐方式:AlignmentDirectional.topStart
I / flutter(3090):textDirection:ltr
I /颤振(3090):适合:宽松
I /颤振(3090):溢出:剪辑
I / flutter(3090):提供无限高度限制的最近祖先是:
I / flutter(3090):RenderStack#df1fd NEEDS-LAYOUT NEEDS-PAINT
I / flutter(3090):创建者:堆栈?语义学?建造者?RepaintBoundary- [GlobalKey#274fe]?忽略指针?
I / flutter(3090):FadeTransition吗?小数翻译?SlideTransition?_MountainViewPageTransition?
I / flutter(3090):AnimatedBuilder吗?RepaintBoundary?_FocusScopeMarker??
I / Flutter(3090):parentData:(可以使用大小)
I / flutter(3090):约束条件:BoxConstraints(w = 360.0,h = 640.0)
I / Flutter(3090):大小:大小(360.0,640.0)
I / Flutter(3090):对齐方式:AlignmentDirectional.topStart
I / flutter(3090):textDirection:ltr
I /颤振(3090):适合:宽松
I /颤振(3090):溢出:剪辑
I / flutter(3090):应用于RenderCustomMultiChildLayoutBox的约束为:
I /颤振(3090):BoxConstraints(无约束)
I / flutter(3090):给出的确切大小是:
I /颤振(3090):大小(无穷大,无穷大)
I / flutter(3090):有关更多信息,请参见https://flutter.io/layout/。
I / flutter(3090):引发异常时,这是堆栈:
I /颤振(3090):#0 RenderBox.debugAssertDoesMeetConstraints。(包:flutter / src / rendering / box.dart:1698:9)
I / flutter(3090):#1 RenderBox.debugAssertDoesMeetConstraints(包:flutter / src / rendering / box.dart:1772:6)
I / flutter(3090):#2 RenderBox.size =。(包:flutter / src / rendering / box.dart:1507:17)
I / flutter(3090):#3 RenderBox.size =(package:flutter / src / rendering / box.dart:1507:65)
I / flutter(3090):#4 RenderCustomMultiChildLayoutBox.performLayout(package:flutter / src / rendering / custom_layout.dart:354:5)
I / flutter(3090):#5 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#6 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#7 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#8 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#9 _RenderCustomClip.performLayout(package:flutter / src / rendering / proxy_box.dart:1141:11)
I / flutter(3090):#10 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#11 RenderStack.performLayout(package:flutter / src / rendering / stack.dart:553:15)
I / flutter(3090):#12 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#13 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#14 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#15 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#16 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#17 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#18 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#19 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#20 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#21 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#22 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#23 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#24 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#25 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#26 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#27 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#28 RenderOffstage.performLayout(package:flutter / src / rendering / proxy_box.dart:2712:13)
I / flutter(3090):#29 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#30 RenderStack.performLayout(package:flutter / src / rendering / stack.dart:514:15)
I / flutter(3090):#31 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#32 __RenderTheatre&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#33 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#34 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#35 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#36 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#37 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#38 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#39 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#40 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout(package:flutter / src / rendering / proxy_box.dart:107:13)
I / flutter(3090):#41 RenderObject.layout(package:flutter / src / rendering / object.dart:1570:7)
I / flutter(3090):#42 RenderView.performLayout(package:flutter / src / rendering / view.dart:125:13)
I / flutter(3090):#43 RenderObject._layoutWithoutResize(package:flutter / src / rendering / object.dart:1445:7)
I / flutter(3090):#44 PipelineOwner.flushLayout(package:flutter / src / rendering / object.dart:709:18)
I / flutter(3090):#45 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding.drawFrame(package:flutter / src / rendering / binding.dart:270:19)
I / flutter(3090):#46 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame(package:flutter / src / widgets / binding.dart:627:13)
I / flutter(3090):#47 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback(package:flutter / src / rendering / binding.dart:208:5)
I / flutter(3090):#48 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback(包:flutter / src / scheduler / binding.dart:990:15)
I / flutter(3090):#49 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame(package:flutter / src / scheduler / binding.dart:930:9)
I / flutter(3090):#50 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame。(包:flutter / src / scheduler / binding.dart:751:7)
I / Flutter(3090):#52 _Timer._runTimers(dart:isolate / runtime / libtimer_impl.dart:382:19)
I / Flutter(3090):#53 _Timer._handleMessage(dart:isolate / runtime / libtimer_impl.dart:416:5)
I / Flutter(3090):#54 _RawReceivePortImpl._handleMessage(dart:isolate / runtime / libisolate_patch.dart:165:12)
I / flutter(3090):(从dart:async包中删除了一帧)
I / flutter(3090):引发异常时,正在处理以下RenderObject:
I / Flutter(3090):RenderCustomMultiChildLayoutBox#04aef relayoutBoundary = up3 NEEDS-LAYOUT NEEDS-PAINT
I / flutter(3090):创建者:CustomMultiChildLayout?AnimatedBuilder?DefaultTextStyle吗?AnimatedDefaultTextStyle吗?
I / Flutter(3090):_InkFeatures- [GlobalKey#64807墨水渲染器]?NotificationListener?
I / flutter(3090):物理模型?AnimatedPhysicalModel?材质?PrimaryScrollController吗?_ScaffoldScope?
I / flutter(3090):脚手架??
I / Flutter(3090):parentData:(可以使用大小)
I / flutter(3090):约束:BoxConstraints(无约束)
I /颤振(3090):大小:大小(无穷大,无穷大)
I / flutter(3090):此RenderObject具有以下后代(显示到深度5):
I / flutter(3090):RenderPositionedBox#4ac32 NEEDS-LAYOUT NEEDS-PAINT
I / Flutter(3090):RenderFlex#a08f4需求布局需求油漆
I / Flutter(3090):RenderParagraph#eba89需求布局需求油漆
I / Flutter(3090):RenderParagraph#5afd6需求布局需求油漆
I / flutter(3090):RenderConstrainedBox#0b71f NEEDS-LAYOUT NEEDS-PAINT
I / flutter(3090):RenderPhysicalModel#fa853需求布局需求油漆
I / Flutter(3090):_RenderInkFeatures#45d75需要布局需要油漆
I / Flutter(3090):RenderPositionedBox#7bd87所需布局所需油漆
I / flutter(3090):RenderPadding#3faff需要布局的需要油漆
I / flutter(3090):RenderStack#4eccb需求布局需求油漆
I / flutter(3090):RenderTransform#16934需要布局需要油漆
I / flutter(3090):RenderTransform#317f7需要布局的需要油漆
I / flutter(3090):RenderSemanticsAnnotations#f02cf NEEDS-LAYOUT NEEDS-PAINT
I / flutter(3090):RenderConstrainedBox#75c14所需布局的需要油漆
I / flutter(3090):????????????????????????????????????????????????? ????????????????????????????????????????????????????????? ???????

问题:1.我的方法正确吗?2.如果正确,那么错误告诉我什么?3.如果不是正确的方法,是否有更简单或更佳的方法来实现?

rmt*_*zie 5

如果我对此有误,请告诉我,但听起来您希望在用户单击菜单按钮时打开导航抽屉。幸运的是,Flutter 已经处理了这个问题!

您可以简单地使用 Scaffold 的drawer属性。您将一个抽屉(或可能是另一个小部件)传递给它以显示,它会自动处理使其可用于从左侧刷入。

如果您还想在按下按钮时打开它,您可以Scaffold.of(context).openDrawer();从您的按钮中使用。请注意,要获取包含脚手架的上下文,您必须使用Builder或使您的 appbar 成为一个新的小部件。