2017-08-28 39 views
0

Dismissibleアイテムのリストを使用していますが、一方向にスワイプしてアイテムを削除したいが、もう一方の方向にスワイプしてアイテムの編集を開始します。しかし、Flutterは、onDismissedコールバックでDismissibleアイテムをツリーから削除する必要があると主張しています。私はアイテムを再挿入しようとしましたが、それは動作しません。何か案は?リスト項目を作成するコードからの抜粋を以下に示します。Flutter Dismissibleはリストアイテムをツリーから削除する必要があります

return new Dismissible(
    key: new ObjectKey(item), 
    direction: DismissDirection.horizontal, 
    onDismissed: (DismissDirection direction) { 
     setState(() { 
     item.deleteTsk(); 
     }); 
     if (direction == DismissDirection.endToStart){ 
     //user swiped left to delete item 
     _scaffoldKey.currentState.showSnackBar(new SnackBar(
      content: new Text('You deleted: ${item.title}'), 
      action: new SnackBarAction(
      label: 'UNDO', 
      onPressed:() { handleUndo(item); } 
     ) 
     )); 
     } 
     if (direction == DismissDirection.startToEnd){ 
     //user swiped right to edit so undo the delete required by flutter 
     Async.scheduleMicrotask((){handleUndo(item);}); 
     Navigator.of(context).pushNamed('/tskedit'); 
     } 
    }, 
    ... 

答えて

2

Dismissibleは、あなたのアイテムがある限り項目主な変更として却下されたと思われます。商品クラスがMyItemであるとします。あなたのnew ObjectKey(item)はあなたを想定した(前に使われていた古いObjectKeyからユニークになるように

class MyItem { 
    MyItem({ @required this.title, @required this.color }); 
    MyItem.from(MyItem other) : title = other.title, color = other.color; 
    final String title; 
    final Color color; 
} 

次にあなたがhandleUndo(new MyItem.from(item))handleUndo(item)を置き換えることができます:あなたはコピーを超えるフィールド、例えばというあなたのMyItemクラスのコンストラクタMyItem.fromを実装する場合MyItemoperator ==を実装していません)。

+0

天才 - ありがとう!より一般的には、このような回避策はまったく必要ないというのはちょっと変です。私のユースケースはそれほど珍しいものではないと思ったでしょう。 – iBob101

+0

「Dismissible」のこのユースケースは扱いにくいことに同意します。より良い行動を提案している場合は、[問題を提出する](https://github.com/flutter/flutter/issues/new)を自由にご利用ください。 –

+0

完了:[link](https://github.com/flutter/flutter/issues/11825) – iBob101

関連する問題