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),
);
}
}
Full code
我有两个错误:
1]水平视区被赋予无限的高度,水平视区被赋予无限的垂直空间来扩展。
2]在构建期间调用了setState()或markNeedsBuild垂直renderflex溢出了99488像素。
请帮助我。我正在创建这个应用程序,在每个图像上单击一个列表应该显示在下面。图像将在一行中,列表应该显示在该行下面。
谢谢大家。
9条答案
按热度按时间jhiyze9q1#
在我的例子中,我在
build
方法完成构建小部件的过程之前调用了setState
方法。如果你在
build
方法完成之前显示snackBar
或alertDialog
,你可能会遇到这个错误。所以,在这种情况下,你应该使用如下所示的回调函数:或者你也可以使用
SchedulerBinding
来做同样的事情:monwx1rj2#
你的密码
执行
buildlist()
并将结果传递给onPressed
,但这不是所需的行为。应该是的
通过这种方式,一个函数(闭包)被传递给
onPressed
,当执行时,调用buildlist()
xzabzqsa3#
我也在构建过程中设置了状态,所以,我把它推迟到下一个滴答,它工作了。
以前
新
odopli944#
WidgetsBinding.instance.addPostFrameCallback
的问题在于,它不是一个包罗万象的解决方案。根据addPostFrameCallback的合同-
在此帧结束时安排一个回调。[...]此回调在帧期间运行,就在持久帧回调[...]之后。如果帧正在进行中并且帧后回调尚未执行,则注册的回调仍在帧期间执行。否则,注册的回调在下一帧期间执行。
最后一句话听起来像是一个交易破坏者。
这个方法不能处理没有“当前帧”的情况,Flutter引擎是空闲的。当然,在这种情况下,可以直接调用
setState()
,但同样,这并不总是有效-有时只是有一个当前帧。值得庆幸的是,在
SchedulerBinding
中,还存在一个解决这个小问题的方案-SchedulerPhase。让我们构建一个更好的
setState
,一个没有抱怨的setState
。(
endOfFrame
基本上与addPostFrameCallback
做的事情相同,除了它尝试在SchedulerPhase.idle
上调度一个新帧,并且它使用async-await而不是回调)这也使得更好的控制流,坦率地说,* 只是工作 *。
vc6uscn95#
我收到这个错误,由于一个相当愚蠢的错误,但也许有人在这里,因为他做了完全相同的事情...
在我的代码中,我有两个类。一个类(B)只是在那里为我创建一个带有onTap函数的特殊小部件。应该由用户点击触发的函数在另一个类(A)中。所以我试图将类A的函数传递给类B的构造函数,以便我可以将其分配给onTap。
不幸的是,我没有传递函数,而是调用它们。这是它的样子:
显然,这是正确的方式:
这解决了我的错误消息。这个错误是有道理的,因为为了让myFunction工作类B的示例,所以我的构建必须首先完成(当调用我的函数时,我显示了一个snackbar)。
希望有一天能帮助到别人!
a5g8bdjr6#
在InkWell的情况下,只需从onTap()中删除花括号
{}
,在GestureDetector或按钮等的情况下,只需从onPressed()中删除花括号{}
。hsgswve47#
当你使用onWillpop方法返回时,会出现这种错误
替换为
我相信你的错误会得到解决...如果任何其他疑问问我任何时间...
whitzsjs8#
在我的例子中,我使用了GetX和一个滑块。对于我的滑块,我直接使用了Rx变量而不是实际值。
我的代码以前
我把代码改成:
现在错误消失了。
htrmnn0y9#
在我的例子中,问题是GetBuilder()
我的代码以前
}
我把代码改成:
}
而且很有效