【问题标题】:Flutter listView isn't updating after deleting itemsFlutter listView在删除项目后没有更新
【发布时间】:2021-09-15 10:00:42
【问题描述】:

我正在使用列表视图来显示一些项目,并且我正在使用flutter_tindercard

要在项目被批准时批准或拒绝项目,应将其添加到已批准项目列表中,然后从列表视图中删除,对于被拒绝的项目也是如此,但当项目被拒绝或批准时,它不会被删除从列表视图中。

PS:底部元素不会移动到顶部


我的代码:

import 'package:flutter/material.dart';
import 'package:flutter_tindercard/flutter_tindercard.dart';

class ExampleHomePage extends StatefulWidget {
  @override
  _ExampleHomePageState createState() => _ExampleHomePageState();
}

class _ExampleHomePageState extends State<ExampleHomePage>
    with TickerProviderStateMixin {
  List approved = [];
  List refused = [];

  List<String> welcomeImages = [
    "https://images.unsplash.com/photo-1631636176993-759dea1a1300?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631634176568-f543af6a41de?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw3fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631691971564-adf9419d904e?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxM3x8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631641906574-24adb8594649?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxMnx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1593642702821-c8da6771f0c6?ixid=MnwxMjA3fDF8MHxlZGl0b3JpYWwtZmVlZHwxMXx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631621461675-e61a1f28d3d6?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0NHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
  ];
  List<TinderCarder> cards = [];
  CardController controller = CardController(); //Use this to trigger swap.

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    cards = welcomeImages.map((element) {
      return TinderCarder(
        image: element,
        controller: controller,
        onLeftPress: () {
          setState(() {
            cards.removeAt(element.indexOf(element));
            print('index is: ' + "${element.indexOf(element)}");
            print('list length: ' + cards.length.toString());
          });
        },
        onRightPress: () {
          setState(() {
            cards.removeAt(element.indexOf(element));
            print('index is: ' + "${element.indexOf(element)}");
            print('list length: ' + cards.length.toString());
          });
        },
      );
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        child: ListView(
          children: cards,
        ),
      ),
    );
  }
}

class TinderCarder extends StatelessWidget {
  final String image;
  Function onLeftPress;
  Function onRightPress;
  var controller;

  TinderCarder(
      {required this.image,
      this.controller,
      required this.onLeftPress,
      required this.onRightPress});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      child: TinderSwapCard(
        orientation: AmassOrientation.BOTTOM,
        totalNum: 1,
        stackNum: 3,
        swipeEdge: 4.0,
        maxWidth: double.infinity,
        maxHeight: MediaQuery.of(context).size.width * 0.9,
        minWidth: MediaQuery.of(context).size.width * 0.8,
        minHeight: MediaQuery.of(context).size.width * 0.8,
        cardBuilder: (context, index) => Card(
          child: Image.network(
            image,
            width: double.infinity,
            fit: BoxFit.cover,
          ),
        ),
        cardController: controller,
        swipeUpdateCallback: (DragUpdateDetails details, Alignment align) {
          /// Get swiping card's alignment
          if (align.x < 0) {
          } else if (align.x > 0) {}
        },
        swipeCompleteCallback: (CardSwipeOrientation orientation, int index) {
          print(orientation.toString());
          if (orientation == CardSwipeOrientation.LEFT) {
            print("Card is LEFT swiping");
            // print(welcomeImages.length);
            onLeftPress();
          } else if (orientation == CardSwipeOrientation.RIGHT) {
            print("Card is RIGHT swiping");
            // print(welcomeImages.length);
            onRightPress();
          }
        },
      ),
    );
  }
}

【问题讨论】:

  • 我更新了我的答案,你只是更新了你的图像列表swipeCompleteCallback ,但你想从swipeUpdateCallback更新

标签: flutter listview


【解决方案1】:

已编辑

试试setstate

import 'package:flutter/material.dart';
import 'package:flutter_tindercard/flutter_tindercard.dart';

class ExampleHomePage extends StatefulWidget {
  @override
  _ExampleHomePageState createState() => _ExampleHomePageState();
}

class _ExampleHomePageState extends State<ExampleHomePage>
    with TickerProviderStateMixin {
  List approved = [];
  List refused = [];

  List<String> welcomeImages = [
    "https://images.unsplash.com/photo-1631636176993-759dea1a1300?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631634176568-f543af6a41de?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw3fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631691971564-adf9419d904e?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxM3x8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631641906574-24adb8594649?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxMnx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1593642702821-c8da6771f0c6?ixid=MnwxMjA3fDF8MHxlZGl0b3JpYWwtZmVlZHwxMXx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
    "https://images.unsplash.com/photo-1631621461675-e61a1f28d3d6?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0NHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
  ];
  List<TinderCarder> cards = [];
  CardController controller = CardController(); //Use this to trigger swap.

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    cards = welcomeImages.map((element) {
      return TinderCarder(
        image: element,
        controller: controller,
        onLeftPress: () {
          setState(() {
            cards.removeAt(element.indexOf(element));
            print('index is: ' + "${element.indexOf(element)}");
            print('list length: ' + cards.length.toString());
          });
        },
        onRightPress: () {
          setState(() {
            cards.removeAt(element.indexOf(element));
            print('index is: ' + "${element.indexOf(element)}");
            print('list length: ' + cards.length.toString());
          });
        },
      );
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        child: SingleChildScrollView(
          child: ListView(
            shrinkWrap: true,
            key: Key(cards.length.toString()),
            physics: ScrollPhysics(),
            children: cards,
          ),
        ),

      ),
    );
  }
}

class TinderCarder extends StatelessWidget {
  final String image;
  Function onLeftPress;
  Function onRightPress;
  var controller;

  TinderCarder(
      { this.image,
        this.controller,
         this.onLeftPress,
         this.onRightPress});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      child: TinderSwapCard(
        orientation: AmassOrientation.BOTTOM,
        totalNum: 1,
        stackNum: 3,
        swipeEdge: 4.0,
        maxWidth: MediaQuery.of(context).size.width * 0.9,
        maxHeight: MediaQuery.of(context).size.width * 0.9,
        minWidth: MediaQuery.of(context).size.width * 0.8,
        minHeight: MediaQuery.of(context).size.width * 0.8,
        cardBuilder: (context, index) => Card(
          child: Image.network(
            image,
            width: double.infinity,
            fit: BoxFit.cover,
          ),
        ),
        cardController: controller,
        swipeUpdateCallback: (DragUpdateDetails details, Alignment align) {
          /// Get swiping card's alignment
          if (align.x < 0) {
          } else if (align.x > 0) {}
        },
        swipeCompleteCallback: (CardSwipeOrientation orientation, int index) {
          print(orientation.toString());
          if (orientation == CardSwipeOrientation.LEFT) {
            print("Card is LEFT swiping");
            // print(welcomeImages.length);
            onLeftPress();
          } else if (orientation == CardSwipeOrientation.RIGHT) {
            print("Card is RIGHT swiping");
            // print(welcomeImages.length);
            onRightPress();
          }
        },
      ),
    );
  }
}

【讨论】:

  • 感谢您的留言,但是当删除项目时,卡片会变成白色的空白
  • 更新了答案,您使用了 listview 并且每个项目只拍摄了一张图片,这就是它显示为空的原因
  • 更新了我的答案,这是您的解决方案,如果对您有帮助,请标记为答案
  • 太好了,现在它只剩下一个问题,即当项目被删除时,它的位置保持为空
  • 毕竟,得到了解决方案。更新我的答案请检查
【解决方案2】:

如果您使用有状态小部件,则应用 setstate() 再次构建您的小部件。 如果您想使用无状态小部件而不是使用 GetX 或提供程序等状态管理。 对于 GetX,在控制器中创建可观察列表并用 obx 包装小部件,因此每当更新列表时,obx 都会再次为您构建该特定小部件。 要正确学习 GetX,请浏览由 tadas Petra 创建的播放列表。 https://www.youtube.com/playlist?list=PL26uY6-lIzqkmvpNr9gMCrIvl8k5Mqrhs

【讨论】:

  • 请再次检查我的问题
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多