2

Firebase データベース (Cloud Firestore) からロードされたアイテムのリストを含むシンプルな Flutter アプリがあります。

ここに画像の説明を入力

ご覧のとおり、アイテムを追加するためのボタンがあり、各アイテムを削除または編集できます。選択したアイテムの編集ボタンを押すと、TextField を含む AlertDialog が表示されます。この TextField で、ユーザーは現在のアイテム名を表示して編集できます。 編集後にダイアログを閉じる場合にのみ問題があります。

   new IconButton(
      icon: new Icon(Icons.edit, color: Colors.white),
      onPressed: (){ showItemUpdateDialog(context, document); }
   )
   .......


void showItemUpdateDialog(BuildContext context, DocumentSnapshot item) {

  String itemName = "";
  var textContoller = new TextEditingController();
  textContoller.text = item['name'];

  var dialog = new AlertDialog(
    title: new Text("item name"),
    content: new TextField(
      controller: textContoller,
      onChanged: (value) {newName = value;},
    ),
    actions: <Widget>[
      new FlatButton(
        child: Text("cancel"),
        onPressed: (){
          Navigator.pop(context);
        },
      ),
      new FlatButton(
          child: Text("Update"),
          onPressed: () { 
            updateItemOnServer(item, newName); 
            Navigator.pop(context); 
          }
      )
    ],
  );

  showDialog(context: context, child: dialog);
}

値は正しく更新されていますが、AlertDialog は閉じられません。エラーコードは以下です。サーバーから修正・更新されたアイテムから呼び出されたことが原因だと思います。

flutter: ジェスチャの処理中に次のアサーションがスローされました: flutter: 非アクティブ化されたウィジェットの祖先を検索することは安全ではありません。flutter: この時点で、ウィジェットの要素ツリーの状態は安定していません。flutter: ウィジェットの祖先を dispose() メソッドで安全に参照するには、ウィジェットの didChangeDependencies() メソッドで flutter: inheritFromWidgetOfExactType() を呼び出して、祖先への参照を保存します。

4

3 に答える 3

12

これを試して、

 Navigator.of(context, rootNavigator: true).pop(),
于 2018-08-21T06:58:07.293 に答える