对象函数意外地在颤振中的另一个对象中运行相同的函数

问题描述

我正在尝试编写一个列表来显示文件夹。 它看起来像这样:

enter image description here

在这图片中,“d3”被隐藏了,因为“d4”被展开了。

如果我点击“d5”,它会隐藏“d4”、“d4_1”和“d4_2”,而不是显示“d6”在“d5”下。

问题来了:

如果我再次点击“d5”折叠,它应该显示“d4”“d4_1”和“d4_2”并隐藏“d6”, 但是当我运行它时它没有显示“d4_1”。

我尝试运行并打印日志并发现“当在 'd4_1' 中运行 setVisibility(true) 时,它实际上在 'd6' 中运行了 setVisibility(true)”。

我不知道为什么以及如何修复它。

这是我的代码

tree_node.dart

import 'package:Flutter/widgets.dart';

class ListNode extends StatefulWidget {
  int level;
  String name;
  bool visible = true;
  bool collapsed = true;
  ListNode parentNode;
  List<ListNode> subNodes;
  Function(bool) setVisibility;
  Function() onNodeClick;
  Function() onCollapseClick;

  ListNode(
      {this.level,this.name,this.parentNode,this.setVisibility,this.onCollapseClick});

  @override
  ListNodeState createState() => ListNodeState();

  static ListNode generateList({Function() onCollapseClick}) {
    final root = ListNode(
      level: 0,name: "root",onCollapseClick: onCollapseClick,);

    //level 1
    final d1 = ListNode(
        level: 1,name: "d1",parentNode: root,onCollapseClick: onCollapseClick);

    final d2 = ListNode(
        level: 2,name: "d2",parentNode: d1,onCollapseClick: onCollapseClick);

    final d3 = ListNode(
        level: 3,name: "d3",parentNode: d2,onCollapseClick: onCollapseClick);
    final d4 = ListNode(
        level: 4,name: "d4",parentNode: d3,onCollapseClick: onCollapseClick);
    final d41 = ListNode(
        level: 5,name: "d4_1",parentNode: d4,onCollapseClick: onCollapseClick);

    final d42 = ListNode(
        level: 5,name: "d4_2",onCollapseClick: onCollapseClick);
    final d41sub = ListNode(
        level: 5,name: "end 4_1",parentNode: d41,onCollapseClick: onCollapseClick);
    final d42sub = ListNode(
        level: 5,name: "end 4_2",parentNode: d42,onCollapseClick: onCollapseClick);
    final d5 = ListNode(
        level: 5,name: "d5",onCollapseClick: onCollapseClick);
    final d6 = ListNode(
        level: 6,name: "d6",parentNode: d5,onCollapseClick: onCollapseClick);
    final d7 = ListNode(level: 7,name: "d7",parentNode: d6);

    root.subNodes = [
      d1,];
    d1.subNodes = [d2];

    d2.subNodes = [d3];
    d3.subNodes = [d4];
    d4.subNodes = [d5,d41,d42];
    d5.subNodes = [d6];
    d6.subNodes = [d7];
    d41.subNodes = [d41sub];
    d42.subNodes = [d42sub];
    return root;
  }

  Function expandParent;

  Function collapseParent;
}

class ListNodeState extends State<ListNode> {
  static int counter = 0;

  @override
  void initState() {
    super.initState();
    widget.setVisibility = _setVisibility;
    widget.expandParent = _expandParent;

    widget.collapseParent = _collapseParent;
  }

  void _expandParent() {
    _setVisibility(true);
    widget.subNodes?.forEach((element) {
      print(element.name + " setVisibility");
      element.setVisibility(true);
      element.setVisibility(true);
    });
  }

  void _collapseParent(String name) {
    _setVisibility(false);
    widget.subNodes.forEach((element) {
      if (element.name != name) element.setVisibility(false);
    });

    //if (widget.parentNode != null) widget.parentNode.setVisibility(false);
  }

  void _setVisibility(bool isVisible) {
    setState(() {
      print(widget.name + " setVisibility = " + isVisible.toString());
      widget.visible = isVisible;
      print(widget.name + " Visibility = " + widget.visible.toString());
    });
  }

  @override
  Widget build(BuildContext context) {
    if (!widget.visible) {
      return Container();
    }

    if (widget.subNodes == null) return endNode();

    return Column(children: [
      Container(
        color: Color.fromrGBO(0,0.3),padding:
            EdgeInsets.only(left: 10.0 + widget.level * 15,top: 10,bottom: 5),constraints: BoxConstraints(
          minHeight: 50,),child: InkWell(
          onTap: () {
            setState(() {
              widget.collapsed = !widget.collapsed;
              checkLevelCollapse();

              widget.onCollapseClick();
            });
          },child: Row(children: [
            (widget.subNodes == null)
                ? Container()
                : Icon(widget.collapsed
                    ? Icons.arrow_right
                    : Icons.arrow_drop_down),SizedBox(
              width: 5,SizedBox(
              width: widget.level == 0 ? 15 : 30,Flexible(
                child: Text("${widget.name}",style: TextStyle(color: Colors.white,fontSize: 14),softWrap: true)),]),Divider(
        color: Colors.blue,thickness: 0.2,height: 0.2,)
    ]);
  }

  Widget endNode() {
    Widget result;
    result = Column(children: [
      Container(
        constraints: BoxConstraints(
          minHeight: 50,color: Color.fromrGBO(0,padding: EdgeInsets.only(left: 5,child: InkWell(
          onTap: () {
            setState(() {
              widget.collapsed = !widget.collapsed;

              widget.subNodes?.forEach((e) {
                e.setVisibility(!widget.collapsed);
              });
            });
          },child: Row(children: [
            SizedBox(
              width: 5,Opacity(
                opacity: 0.3,child: Image.asset(
                  'assets/images/c4/group_list_more_btn_delete.png',width: 15,)),SizedBox(
              width: 50,Expanded(
                child: GestureDetector(
              child: Text("${widget.name}",softWrap: true),onTap:
                  widget.onNodeClick == null ? donothing : widget.onNodeClick,child: Image.asset(
                  'assets/images/d/install_btn_copy.png',)
    ]);

    return result;
  }

  checkLevelCollapse() {
    if (widget.parentNode != null && widget.level > 3)
      widget.collapsed
          ? widget.parentNode.expandParent()
          : widget.parentNode.collapseParent(widget.name);
  }

  void donothing() {}
}

main.dart

import 'package:list_bug_test/tree_node.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',theme: ThemeData(
        primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,home: MyHomePage(title: 'Flutter Demo Home Page'),);
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key,this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  ListNode rootNode;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (rootNode == null)
      rootNode = ListNode.generateList(onCollapseClick: updateListByNode);
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),body: SingleChildScrollView(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.center,children: divisionTree(rootNode),);
  }

  List<Widget> divisionTree(ListNode node) {
    return [node] +
        (node.subNodes?.fold(
                [],(all,next) =>
                    all + (node.collapsed ? [] : divisionTree(next))) ??
            []);
  }

  updateListByNode() {
    _incrementCounter();
    setState(() {
      rootNode = rootNode;
    });
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)