Flutter - 禁用Dismissable Widget上的dismiss方向

问题描述 投票:3回答:2

我正在编写一个应用程序来保存您的购物清单。对于编辑内容或删除项目,这些项目应该是不允许的。如果要编辑的文本字段中已有其他内容,则应禁用特定方向的滑动。现在我的Dismissible看起来像这样。

    Dismissible(
    background: Container(
      alignment: Alignment.centerLeft,
      padding: EdgeInsets.only(left: 20.0),
      color: Colors.redAccent,
      child: Icon(Icons.delete, color: Colors.white),
    ),
    secondaryBackground: Container(
      alignment: Alignment.centerRight,
      padding: EdgeInsets.only(right: 20.0),
      color: Colors.orangeAccent,
      child: Icon(Icons.edit, color: Colors.white),
    ),
    child: Text("This is my dismissible widget"),
    onDismissed: (direction){
      if(direction == DismissDirection.startToEnd){
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("Swipe to right")));
      } else if(direction == DismissDirection.endToStart){
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("Swipe to right")));
      }
    },
  )

解:

添加这样的解雇指示

    Dismissible(
    background: Container(
      alignment: Alignment.centerLeft,
      padding: EdgeInsets.only(left: 20.0),
      color: Colors.redAccent,
      child: Icon(Icons.delete, color: Colors.white),
    ),
    secondaryBackground: Container(
      alignment: Alignment.centerRight,
      padding: EdgeInsets.only(right: 20.0),
      color: Colors.orangeAccent,
      child: Icon(Icons.edit, color: Colors.white),
    ),
    child: Text("This is my dismissible widget"),
    /*New*/
    direction: (textController.text.isEmpty
        ? DismissDirection.horizontal
        : DismissDirection.startToEnd
    ),
    /*New*/
    onDismissed: (direction){
      if(direction == DismissDirection.startToEnd){
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("Swipe to right")));
      } else if(direction == DismissDirection.endToStart){
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("Swipe to right")));
      }
    },
  )
android ios dart flutter
2个回答
1
投票

您可以通过使用TextItem而不是带有TextItem的Dismissable填充列表来禁用列表项上的可忽略操作。

return new ListView(
     children: snapshot.data.documents.map((document) {
       // Convert snapshot to user item
       MyFBDocuments.ChatMessageItem documentData =
          new MyFBDocuments.ChatMessageItem.fromDocumentSnapshot(
              document);

       // One List Item 
       Widget listItem = new _ChatMessageItem(
           loading: false,
           openedGroupChat: chatInfoDoc.isGroupChat,
           messageDocument: documentData);

       // Determine if dismiss action should be shown 
       if (documentData.senderId == MyAuthentication.authenticatedUser.uid){
         // Create item with dismiss action 
         DismissDirection _dismissDirection = DismissDirection.startToEnd;

         return _DismissableListItem(
           messageDocData: documentData,
           listItem: listItem,
           onRightAction: _handleRightAction,
           onDelete: _handleLeftAction,
           dismissDirection: _dismissDirection,
         );

       } else {
         // display item without dismiss action 
         return listItem;
       }
     }).toList(),
     reverse: true,
     padding: new EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 0.0),
   );

^代码来自CaughtUp:https://www.caughtup-app.com/


0
投票

要实现你需要去掉一个局部变量来操纵dismiss direction并根据你的条件设置它的值:

// Set required dismiss direction
DismissDirection dismissDirection;
if(OneConditionSatisfies && AnotherConditionSatisfies) {
  dismissDirection = DismissDirection.horizontal; // two side dismission
} else if(OneConditionSatisfies) {
  dismissDirection = DismissDirection.startToEnd; // only this one
} else if(AnotherConditionSatisfies) {
  dismissDirection = DismissDirection.endToStart; // only this one
}

// Return widget from `build` function
return Dismissible(
  ...
  direction: dismissDirection,
  ...
);
© www.soinside.com 2019 - 2024. All rights reserved.