Flutter - 无法构建,因为 frawework 已经在构建
Flutter - Cannot build because the frawework is already building
我正在构建一个页面,动态生成一些视图。在我的例子中,显示的列表将根据用户输入进行更新(用作过滤器)。
使用动态呈现的文本小部件时一切正常,但是当我尝试切换到列或网格视图时,一切都出错了并且出现了以下错误
The following assertion was thrown building ServerGrid(dirty; state: _ServerGridState#59211289()):
I/flutter (14351): setState() or markNeedsBuild() called during build.
I/flutter (14351): This Overlay widget cannot be marked as needing to build because the framework is already in the
I/flutter (14351): process of building widgets. A widget can be marked as needing to be built during the build phase
I/flutter (14351): only if one of its ancestors is currently building. This exception is allowed because the framework
I/flutter (14351): builds parent widgets before children, which means a dirty descendant will always be built.
I/flutter (14351): Otherwise, the framework might not visit this widget during this build phase.
I/flutter (14351): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (14351): Overlay([LabeledGlobalKey<OverlayState>#774312152]; state: OverlayState#252339409(entries:
I/flutter (14351): [OverlayEntry#727022347(opaque: false; maintainState: false), OverlayEntry#1051156104(opaque:
I/flutter (14351): false; maintainState: true), OverlayEntry#280497357(opaque: false; maintainState: false),
I/flutter (14351): OverlayEntry#41791024(opaque: false; maintainState: true), OverlayEntry#444321361(opaque: false;
I/flutter (14351): maintainState: false), OverlayEntry#717668788(opaque: false; maintainState: true)]))
这是我目前得到的代码,
ServerGrid 这是抛出错误的地方
导入 'package:flutter/material.dart';
import'package:firebase_sandbox/models/server.dart';
class ServerGrid extends StatefulWidget {
ServerGrid({Key key, this.servers}) : super(key: key);
final servers;
@override
State createState() => new _ServerGridState();
}
class _ServerGridState extends State<ServerGrid> {
showInfos(serv){
showDialog(context: context, child: new AlertDialog(content: new Text(serv.toString())));
}
Widget buildServerTile(Server serv) {
return new InkWell(
onTap: showInfos(serv),
child :
new Column(
children: [
new CircleAvatar(child : new Image.network(serv.image)),
new Text(
serv.name,
style : new TextStyle(fontWeight: FontWeight.bold),
),
new Text(
serv.description,
style : new TextStyle(color : Colors.grey[500]),
),
],
),
);
}
List<Widget> buildGrid() {
var theGrid = <Widget>[];
for(Server s in widget.servers) {
theGrid.add(buildServerTile(s));
}
return theGrid;
}
@override
Widget build(BuildContext context) {
// return new Text("${widget.servers.toString()}"); //Working perfectly
return new GridView(
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
children: buildGrid(),
);
}
}
控制器调用视图进行更新:
filter(value) {
filteredList = _servers.where(
(serv) =>
serv.name.contains(value) || serv.tags
.where((tag) => tag.contains(value))
.length > 0
).toList();
print(filteredList);
setState(() {
serverList = new ServerGrid(servers : filteredList);
});
}
一直在搜索,但我无法弄清楚构建 Gridview 时出了什么问题
您的 onTap
处理程序有问题。它试图在您的构建函数期间立即显示对话框,这是不允许的。
onTap: showInfos(serv),
将您的处理程序更改为函数:
onTap: () => showInfos(serv),
我使用了另一个有趣的解决方案。所以,这里发生的是它通知重建 UI,而 UI 已经在构建,这导致了错误。所以,我修复它的方法是将它放在 Future.delayed() 函数中,并给它一个小的持续时间,比如 1 毫秒。
它的作用是稍后运行 notifylistener,您不会遇到任何问题。
显然这不是正确的解决方法,但可以提供帮助
我正在构建一个页面,动态生成一些视图。在我的例子中,显示的列表将根据用户输入进行更新(用作过滤器)。
使用动态呈现的文本小部件时一切正常,但是当我尝试切换到列或网格视图时,一切都出错了并且出现了以下错误
The following assertion was thrown building ServerGrid(dirty; state: _ServerGridState#59211289()):
I/flutter (14351): setState() or markNeedsBuild() called during build.
I/flutter (14351): This Overlay widget cannot be marked as needing to build because the framework is already in the
I/flutter (14351): process of building widgets. A widget can be marked as needing to be built during the build phase
I/flutter (14351): only if one of its ancestors is currently building. This exception is allowed because the framework
I/flutter (14351): builds parent widgets before children, which means a dirty descendant will always be built.
I/flutter (14351): Otherwise, the framework might not visit this widget during this build phase.
I/flutter (14351): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (14351): Overlay([LabeledGlobalKey<OverlayState>#774312152]; state: OverlayState#252339409(entries:
I/flutter (14351): [OverlayEntry#727022347(opaque: false; maintainState: false), OverlayEntry#1051156104(opaque:
I/flutter (14351): false; maintainState: true), OverlayEntry#280497357(opaque: false; maintainState: false),
I/flutter (14351): OverlayEntry#41791024(opaque: false; maintainState: true), OverlayEntry#444321361(opaque: false;
I/flutter (14351): maintainState: false), OverlayEntry#717668788(opaque: false; maintainState: true)]))
这是我目前得到的代码,
ServerGrid 这是抛出错误的地方 导入 'package:flutter/material.dart';
import'package:firebase_sandbox/models/server.dart';
class ServerGrid extends StatefulWidget {
ServerGrid({Key key, this.servers}) : super(key: key);
final servers;
@override
State createState() => new _ServerGridState();
}
class _ServerGridState extends State<ServerGrid> {
showInfos(serv){
showDialog(context: context, child: new AlertDialog(content: new Text(serv.toString())));
}
Widget buildServerTile(Server serv) {
return new InkWell(
onTap: showInfos(serv),
child :
new Column(
children: [
new CircleAvatar(child : new Image.network(serv.image)),
new Text(
serv.name,
style : new TextStyle(fontWeight: FontWeight.bold),
),
new Text(
serv.description,
style : new TextStyle(color : Colors.grey[500]),
),
],
),
);
}
List<Widget> buildGrid() {
var theGrid = <Widget>[];
for(Server s in widget.servers) {
theGrid.add(buildServerTile(s));
}
return theGrid;
}
@override
Widget build(BuildContext context) {
// return new Text("${widget.servers.toString()}"); //Working perfectly
return new GridView(
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
children: buildGrid(),
);
}
}
控制器调用视图进行更新:
filter(value) {
filteredList = _servers.where(
(serv) =>
serv.name.contains(value) || serv.tags
.where((tag) => tag.contains(value))
.length > 0
).toList();
print(filteredList);
setState(() {
serverList = new ServerGrid(servers : filteredList);
});
}
一直在搜索,但我无法弄清楚构建 Gridview 时出了什么问题
您的 onTap
处理程序有问题。它试图在您的构建函数期间立即显示对话框,这是不允许的。
onTap: showInfos(serv),
将您的处理程序更改为函数:
onTap: () => showInfos(serv),
我使用了另一个有趣的解决方案。所以,这里发生的是它通知重建 UI,而 UI 已经在构建,这导致了错误。所以,我修复它的方法是将它放在 Future.delayed() 函数中,并给它一个小的持续时间,比如 1 毫秒。 它的作用是稍后运行 notifylistener,您不会遇到任何问题。 显然这不是正确的解决方法,但可以提供帮助