问题描述
如果我点击“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 (将#修改为@)