在生成期间调用setState()或markNeedsBuild 类MyHome扩展StatefulWidget{ @凌驾 State createState()=>新建MyHomePage2(); } 类MyHomePage2扩展了状态{ 列表项=新列表(); 构建列表(字符串s){ 设置状态(){ 打印(“输入的构建列表”+s); 列表刷新=新建列表(); 如果(s==“按钮0”){ 刷新=[ 新点心(“西瓜”,250), 新点心(“橙色”,275), 新点心(“松树”,300), 新点心(“木瓜”,225), 新点心(“苹果”,250), ]; }如果(s=='button1',则为else){ 刷新=[ 新点心(“Pina Colada”,250), 新点心(“血腥玛丽”,275), 新点心(“长岛冰茶”,300), 新点心(“螺丝刀”,225), 新点心(“融合鸡尾酒”,250), ]; }如果(s=='button2',则为else){ 刷新=[ 新茶点(“维珍Pina Colada”,250), 新点心(“圣母玛利亚”,275), 新点心(“草莓汁”,300), 新点心(“芒果潜水员”,225), 新点心(“桃子乐”,250), ]; }否则{ 刷新=[ 新点心(“绝对”,250), 新点心(“斯米尔诺夫”,275), 新点心(“白色淘气”,300), 新点心(“Romanov”,225), 新点心(“搅拌机的骄傲”,250), ]; } for(刷新中的变量项){ 添加(新项目列表(项目)); } }); } @凌驾 小部件构建(构建上下文){ var abc=MediaQuery.of(context).size; 打印(abc宽度); 可变宽度=abc.width/4; 文本文本=新文本(“开发”); Text text2=新文本(“Sneha”); Text text3=新文本(“Prashant”); 文本文本4=新文本(“Vikesh”); var pad=所有常数边集(10.0); Padding pad1=新的填充(子项:文本,填充:pad); Padding pad2=新的填充(子:text2,Padding:pad); Padding pad3=新的填充(子:text3,Padding:pad); Padding pad4=新的填充(子:text4,Padding:pad); ListView ListView=新建ListView(子项:[ 新建Image.asset('images/party.jpg'), pad1, pad2, pad3, pad4 ]); 抽屉=新抽屉(子项:listView); 归还新脚手架( 抽屉:抽屉, appBar:新的appBar( 标题:新文本(“酗酒”), ), 正文:新列(子项:[ 新建ListView.builder( 滚动方向:轴水平, 物品计数:4, itemBuilder:(构建上下文,int索引){ 返回新列(子项:[ 新容器( 儿童:新的灵活( 孩子:新的扁平按钮( 子级:新建Image.asset('images/party.jpg', 宽度:宽度,高度:宽度), onPressed:buildlist('button'+index.toString()), )), 宽度:宽度, 高度:宽度, ) ]); }, ), 新扩展( 子:新列表视图( 填充:来自LTRB(10.0,10.0,0.0,10.0)的新边缘设置, 儿童:项目, 滚动方向:轴垂直, )), ]), floatingActionButton:新的floatingActionButton( onPressed:null, 子:新图标(Icons.add), ),//此尾随逗号使生成方法的自动格式设置更方便。 ); } } 课堂点心{ 字符串名; 国际价格; 茶点(这个名字,这个价格); } 类ItemsList扩展了无状态小部件{ 最后的点心; 项目列表(这是茶点); @凌驾 小部件构建(构建上下文){ 返回新的ListTile( onTap:null, 标题:新文本(茶点名称), ); } }

在生成期间调用setState()或markNeedsBuild 类MyHome扩展StatefulWidget{ @凌驾 State createState()=>新建MyHomePage2(); } 类MyHomePage2扩展了状态{ 列表项=新列表(); 构建列表(字符串s){ 设置状态(){ 打印(“输入的构建列表”+s); 列表刷新=新建列表(); 如果(s==“按钮0”){ 刷新=[ 新点心(“西瓜”,250), 新点心(“橙色”,275), 新点心(“松树”,300), 新点心(“木瓜”,225), 新点心(“苹果”,250), ]; }如果(s=='button1',则为else){ 刷新=[ 新点心(“Pina Colada”,250), 新点心(“血腥玛丽”,275), 新点心(“长岛冰茶”,300), 新点心(“螺丝刀”,225), 新点心(“融合鸡尾酒”,250), ]; }如果(s=='button2',则为else){ 刷新=[ 新茶点(“维珍Pina Colada”,250), 新点心(“圣母玛利亚”,275), 新点心(“草莓汁”,300), 新点心(“芒果潜水员”,225), 新点心(“桃子乐”,250), ]; }否则{ 刷新=[ 新点心(“绝对”,250), 新点心(“斯米尔诺夫”,275), 新点心(“白色淘气”,300), 新点心(“Romanov”,225), 新点心(“搅拌机的骄傲”,250), ]; } for(刷新中的变量项){ 添加(新项目列表(项目)); } }); } @凌驾 小部件构建(构建上下文){ var abc=MediaQuery.of(context).size; 打印(abc宽度); 可变宽度=abc.width/4; 文本文本=新文本(“开发”); Text text2=新文本(“Sneha”); Text text3=新文本(“Prashant”); 文本文本4=新文本(“Vikesh”); var pad=所有常数边集(10.0); Padding pad1=新的填充(子项:文本,填充:pad); Padding pad2=新的填充(子:text2,Padding:pad); Padding pad3=新的填充(子:text3,Padding:pad); Padding pad4=新的填充(子:text4,Padding:pad); ListView ListView=新建ListView(子项:[ 新建Image.asset('images/party.jpg'), pad1, pad2, pad3, pad4 ]); 抽屉=新抽屉(子项:listView); 归还新脚手架( 抽屉:抽屉, appBar:新的appBar( 标题:新文本(“酗酒”), ), 正文:新列(子项:[ 新建ListView.builder( 滚动方向:轴水平, 物品计数:4, itemBuilder:(构建上下文,int索引){ 返回新列(子项:[ 新容器( 儿童:新的灵活( 孩子:新的扁平按钮( 子级:新建Image.asset('images/party.jpg', 宽度:宽度,高度:宽度), onPressed:buildlist('button'+index.toString()), )), 宽度:宽度, 高度:宽度, ) ]); }, ), 新扩展( 子:新列表视图( 填充:来自LTRB(10.0,10.0,0.0,10.0)的新边缘设置, 儿童:项目, 滚动方向:轴垂直, )), ]), floatingActionButton:新的floatingActionButton( onPressed:null, 子:新图标(Icons.add), ),//此尾随逗号使生成方法的自动格式设置更方便。 ); } } 课堂点心{ 字符串名; 国际价格; 茶点(这个名字,这个价格); } 类ItemsList扩展了无状态小部件{ 最后的点心; 项目列表(这是茶点); @凌驾 小部件构建(构建上下文){ 返回新的ListTile( onTap:null, 标题:新文本(茶点名称), ); } },listview,dart,size,flutter,setstate,Listview,Dart,Size,Flutter,Setstate,我有两个错误: 1] 水平视口被赋予无限高。 水平视口有无限的垂直空间可供展开 2] 在生成期间调用setState()或markNeedsBuild 垂直renderflex溢出99488像素 请帮帮我。我正在创建这个应用程序,在每个图像上单击一个列表,应该显示在下面。图像将在一行中,列表应显示在该行下方 谢谢。您的代码 class MyHome extends StatefulWidget { @override State<StatefulWidget> createS

我有两个错误:

1] 水平视口被赋予无限高。 水平视口有无限的垂直空间可供展开

2] 在生成期间调用setState()或markNeedsBuild 垂直renderflex溢出99488像素

请帮帮我。我正在创建这个应用程序,在每个图像上单击一个列表,应该显示在下面。图像将在一行中,列表应显示在该行下方

谢谢。

您的代码

class MyHome extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new MyHomePage2();
}

class MyHomePage2 extends State<MyHome> {
  List items = new List();

  buildlist(String s) {
    setState(() {
      print("entered buildlist" + s);
      List refresh = new List();
      if (s == 'button0') {
        refresh = [
          new Refreshments("Watermelon", 250),
          new Refreshments("Orange", 275),
          new Refreshments("Pine", 300),
          new Refreshments("Papaya", 225),
          new Refreshments("Apple", 250),
        ];
      } else if (s == 'button1') {
        refresh = [
          new Refreshments("Pina Colada", 250),
          new Refreshments("Bloody Mary", 275),
          new Refreshments("Long Island Ice tea", 300),
          new Refreshments("Screwdriver", 225),
          new Refreshments("Fusion Cocktail", 250),
        ];
      } else if (s == 'button2') {
        refresh = [
          new Refreshments("Virgin Pina Colada", 250),
          new Refreshments("Virgin Mary", 275),
          new Refreshments("Strawberry Flush", 300),
          new Refreshments("Mango Diver", 225),
          new Refreshments("Peach Delight", 250),
        ];
      } else {
        refresh = [
          new Refreshments("Absolute", 250),
          new Refreshments("Smirnoff", 275),
          new Refreshments("White Mischief", 300),
          new Refreshments("Romanov", 225),
          new Refreshments("Blender's Pride", 250),
        ];
      }

      for (var item in refresh) {
        items.add(new ItemsList(item));
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    var abc = MediaQuery.of(context).size;

    print(abc.width);

    var width = abc.width / 4;

    Text text = new Text("Dev");
    Text text2 = new Text("Sneha");
    Text text3 = new Text("Prashant");
    Text text4 = new Text("Vikesh");

    var pad = const EdgeInsets.all(10.0);

    Padding pad1 = new Padding(child: text, padding: pad);
    Padding pad2 = new Padding(child: text2, padding: pad);
    Padding pad3 = new Padding(child: text3, padding: pad);
    Padding pad4 = new Padding(child: text4, padding: pad);

    ListView listView = new ListView(children: <Widget>[
      new Image.asset('images/party.jpg'),
      pad1,
      pad2,
      pad3,
      pad4
    ]);

    Drawer drawer = new Drawer(child: listView);

    return new Scaffold(
      drawer: drawer,

      appBar: new AppBar(
        title: new Text('Booze Up'),
      ),
      body: new Column(children: <Widget>[
        new ListView.builder(
          scrollDirection: Axis.horizontal,
          itemCount: 4,
          itemBuilder: (BuildContext context, int index) {
            return new Column(children: <Widget>[
              new Container(
                child: new Flexible(
                    child: new FlatButton(
                  child: new Image.asset('images/party.jpg',
                      width: width, height: width),
                  onPressed: buildlist('button' + index.toString()),
                )),
                width: width,
                height: width,
              )
            ]);
          },
        ),
        new Expanded(
            child: new ListView(
          padding: new EdgeInsets.fromLTRB(10.0, 10.0, 0.0, 10.0),
          children: items,
          scrollDirection: Axis.vertical,
        )),
      ]),

      floatingActionButton: new FloatingActionButton(
        onPressed: null,
        child: new Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class Refreshments {
  String name;
  int price;

  Refreshments(this.name, this.price);
}

class ItemsList extends StatelessWidget {
  final Refreshments refreshments;

  ItemsList(this.refreshments);

  @override
  Widget build(BuildContext context) {
    return new ListTile(
      onTap: null,
      title: new Text(refreshments.name),
    );
  }
}
执行
buildlist()
并将结果传递给按下的
onPressed
,但这不是所需的行为

应该是

onPressed: buildlist('button'+index.toString()),

这样,一个函数(闭包)被传递给按下的
onPressed
,当执行该函数时,调用
buildlist()

在我的例子中,我在build方法完成构建小部件的过程之前调用setState方法

如果在构建方法完成之前以及在许多其他情况下显示“快餐店”或“警报”对话框,则可能会遇到此错误。所以在这种情况下使用下面的回调函数

onPressed: () => buildlist('button'+index.toString()),
或者您也可以使用SchedulerBinding,它也可以执行相同的操作

WidgetsBinding.instance.addPostFrameCallback((_){

  // Add Your Code here.

});

我还在构建过程中设置了状态,所以,我将其推迟到下一个滴答声,结果成功了

以前

myFunction()
新的

Future.delayed(Duration.zero,()异步{
myFunction();
});

由于一个相当愚蠢的错误,我收到了这个错误,但可能有人在这里,因为他做了完全相同的事情

在我的代码中,我有两个类。一个类(B)就是用来创建一个带有onTap函数的特殊小部件的。应该由用户点击触发的函数在另一个类(A)中。因此,我试图将类A的函数传递给类B的构造函数,以便将其分配给onTap

不幸的是,我没有传递函数,而是调用了它们。 这就是它看起来的样子:

SchedulerBinding.instance.addPostFrameCallback((_) {

  // add your code here.

  Navigator.push(
        context,
        new MaterialPageRoute(
            builder: (context) => NextPage()));
});
显然,这是正确的方法:

ClassB classBInstance = ClassB(...,myFunction());
这解决了我的错误消息。 这个错误是有道理的,因为为了MyFunction
ClassB classBInstance = classB(...,myFunction);
Future<bool> rebuild() async {
  if (!mounted) return false;

  // if there's a current frame,
  if (SchedulerBinding.instance.schedulerPhase != SchedulerPhase.idle) {
    // wait for the end of that frame.
    await SchedulerBinding.instance.endOfFrame;
    if (!mounted) return false;
  }

  setState(() {});
  return true;
}
await someTask();

if (!await rebuild()) return;

await someOtherTask();