flutter允许的小部件变量依赖性

时间:2018-12-17 11:47:45

标签: background flutter dismissible

编辑:已修复。向下看

旧问题:

我正在试验Dismissible小部件。 我可以成功监视该方向的状态,该状态存储在directionVar中。 它输出类似DismissDirection.endToStart

我想使用此信息来更改显示的图标的位置。 删除项目时,背景为红色,右侧为图标。像Gmail这样的样式。

Widget build(BuildContext context) {
        DismissDirection directionVar;
        return ListView.builder(
          itemBuilder: (BuildContext context, int index) {
            return Dismissible(
              key: Key(products[index]['title']), //Should be unique.
              onDismissed: (DismissDirection direction) {
                directionVar = direction;
              },

我的问题是这部分:

              background: Container(
                 color: Colors.red,
                padding: EdgeInsets.only(left: 20.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                    Icon(
                      Icons.delete,
                    )
                  ],
                ),
              ),);});}

我希望该部分根据directionVar的值进行更改。 padding应该随directionVarmainAxisAlignment的值而变化。

遵循以下原则:

        if(directionVar == DismissDirection.endToStart){

        } else if (directionVar == DismissDirection.startToEnd){

        }

但是我无法访问这些语句中的background:和padding属性,因为它们是Dismissible小部件的属性,并且无法在{{1 }}

这似乎是简单的问题,但似乎无法解决。

编辑:已修复。。非常简单。只需添加以下内容:

onDismissed(){}

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现此目的。例如,您可以创建一种方法来动态处理方向,然后在小部件树中相应地对其进行更新。像

    List<dynamic> _resolveDirection(DismissDirection direction) {

    switch (direction) {
        case DismissDirection.endToStart:
          return [MainAxisAlignment.center, 20.0];
          break;
        case DismissDirection.startToEnd:
          return [MainAxisAlignment.start, 10.0];
          break;
        case DismissDirection.vertical:
          return [MainAxisAlignment.end, 5.0];
          break;
        // And so on...
        default:
          return [];
      }
    }

然后用

替换树
 background: Container(
                 color: Colors.red,
                padding: _resolveDirection(directionVar)[1],
                child: Row(
                  mainAxisAlignment: _resolveDirection(directionVar)[0],
                  children: <Widget>[
                    Icon(
                      Icons.delete,
                    )
                  ],
                ),
              ),);});}

最后,每次滑动时您要做的就是以更新的方向重建树

setState(() => directionVar = direction);