2017-06-11 13 views
1

私はページを構築して、動的にいくつかのビューを生成しています。私の場合、表示されたリストはユーザーの入力(フィルタとして使用)を考慮して更新されます。Flutter - フレーミングワークがすでに構築されているために構築できません。

ウィジェットはdynamiclyレンダリングされるテキストを使用する場合は、すべてが完璧に働いていたが、私は列またはGridViewのに切り替えしようとしたとき、すべてが間違っていたとなったfolowwingエラー

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ここでエラーがスローされました import '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の

答えて

2

を構築するとき、私はあなたがあなたのonTapハンドラに問題がある間違っているかを把握することはできません。ビルド関数中にすぐにダイアログを表示しようとしていますが、これは許可されていません。

onTap: showInfos(serv), 
機能であるためにあなたのハンドラを変更し

onTap:() => showInfos(serv), 
+0

うわー... を私は、このような愚かな誤りをしているため、自分の恥ずかしいです。ありがとうCollin! –

+0

これは非常に一般的な間違いです、私もそれを作った:) –

+0

ああ、私はこれのために過去12時間私の尾を追いかけてきました... – sofakingforever

関連する問題