Flutter Dismissible 背景在列表项被关闭后上升

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

我刚刚开始学习 flutter 并尝试构建一个待办事项应用程序,我遇到的问题是设置为可解雇背景的小部件 buildActionSwipeLeft() 在列表项被解雇后上升而不是从左到右,尽管我设置了可解雇的方向从左到右或从开始到结束。任何帮助将不胜感激。

我的代码:

  Widget build(BuildContext context) {
return Scaffold(
  body: SafeArea(
    child: Container(
      width: double.infinity,
      padding: const EdgeInsets.symmetric(
        horizontal: 24.0,
      ),
      color: const Color(0xfff6f6f6f6),
      child: Stack(
        children: [
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Container(
                margin: const EdgeInsets.only(bottom: 32.0, top: 32.0),
                child: const Text(
                  "Reminders",
                  style: TextStyle(
                    fontSize: 25.0,
                    fontWeight: FontWeight.bold
                  ),
                ),
              ),
              Expanded(
                child: ListView.builder(
                  itemCount: todos.length,
                  physics: const BouncingScrollPhysics(),
                  itemBuilder: (BuildContext context, int index) {
                    return Padding(
                          padding: const EdgeInsets.only(
                            bottom: 15.0
                          ),
                          child: Card(
                            color: Colors.white,
                            shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(16),
                            ),
                            elevation: 4,
                            child: ClipRRect(
                              clipBehavior: Clip.antiAlias,
                              child: Dismissible(
                                  background: buildActionSwipeLeft(),
                                  onDismissed: (direction) {
                                    setState(() {
                                      todos.removeAt(index);
                                      _titleController.removeAt(index);
                                      _detailController.removeAt(index);
                                    });
                                  },
                                  direction: DismissDirection.startToEnd,
                                  key: UniqueKey(),
                                  child: Container(
                                      width: double.infinity,
                                      padding: const EdgeInsets.symmetric(
                                          vertical: 13.0,
                                          horizontal: 24.0
                                      ),
                                      margin: const EdgeInsets.only(
                                        bottom: 20.0,
                                      ),
                                      child: Column(
                                        crossAxisAlignment: CrossAxisAlignment.start,
                                        children: [
                                          TextField(
                                            cursorColor: Colors.black,
                                            controller: _titleController[index],
                                            style: const TextStyle(
                                                fontSize: 22.0,
                                                fontWeight: FontWeight.bold
                                            ),
                                            decoration: const InputDecoration(
                                              hintText: "Enter a title",
                                              border: InputBorder.none,
                                            ),
                                          ),
                                          const Divider(
                                            color: Colors.black,
                                          ),
                                          Padding(
                                            padding: const EdgeInsets.only(top: 0.0),
                                            child: TextField(
                                              controller: _detailController[index],
                                              style: TextStyle(
                                                fontSize: 20.0,
                                                color: Colors.grey[900],
                                              ),
                                              cursorColor: Colors.black,
                                              maxLines: null,
                                              decoration: const InputDecoration(
                                                  hintText: "Enter the description",
                                                  label: Text("description"),
                                                  border: InputBorder.none
                                              ),
                                            ),
                                          ),
                                        ],
                                      ),
                                    ),
                                ),
                            ),
                          ),
                        );
                  },
                ),
              )
            ],
          ),
          Positioned(
            bottom: 24.0,
            right: 0.0,
            child: GestureDetector(
              onTap: () {
                setState(() {
                  todos.add('');
                  _titleController.add(TextEditingController());
                  _detailController.add(TextEditingController());
                });
              },
              child: Container(
              width: 60.0,
              height: 60.0,
              decoration: BoxDecoration(
                color: Colors.black87,
                borderRadius: BorderRadius.circular(20.0),
              ),
              child: const Icon(Icons.add, color: Colors.white, size: 35.0),
              ),
            ),
          )
        ],
      ),
    ),
  ),
);
  }
}

Widget buildActionSwipeLeft() => Container(
    alignment: Alignment.centerLeft,
    decoration: BoxDecoration(
      borderRadius: BorderRadius.circular(16.0),
      color: Colors.redAccent,
    ),
    padding: const EdgeInsets.symmetric(horizontal: 30),
    child: const Icon(Icons.delete, color: Colors.white, size: 30),
  );
flutter dart
2个回答
0
投票

我发现这不是问题,因为这是当可关闭小部件中包含的列表图块被关闭时播放的默认动画。并且

dismiss direction
只是确定您可以滑动小部件的方向,而不是小部件在关闭后动画的方向。


0
投票

我遇到了类似的问题,要完全删除拖动可忽略项后上升的背景,只需将

resizeDuration
值设置为
null

 Dismissible(
        resizeDuration: null,

如此处文档中所述:https://api.flutter.dev/flutter/widgets/Dismissible/resizeDuration.html

如果为 null,则小部件将不会收缩,并且 onDismissed 将在小部件关闭后立即调用。

© www.soinside.com 2019 - 2024. All rights reserved.