我正在构建一个页面,并动态生成一些视图。在我的情况下,显示的列表将根据用户输入(用作过滤器)进行更新。
使用Text Widget进行动态渲染时,所有工具都运行良好,但是当我尝试切换到Column或Gridview时,一切都出错了,并且出现了以下错误
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
onTap: showInfos(serv),
将您的处理程序更改为函数:
onTap: () => showInfos(serv),