gpt4 book ai didi

Flutter 避免在折叠/展开 ExpansionPanelList 时重建小部件

转载 作者:行者123 更新时间:2023-12-02 04:46:32 29 4
gpt4 key购买 nike

ExpansionPanelList 中,我在展开/折叠小部件时遇到重建小部件的问题。

问题出在这里:

expansionCallback: (int index, bool isExpanded) {
setState(() {
_profileExpansionStateMap[_profileExpansionStateMap.keys.toList()[index]] = !isExpanded;
});
},

我将其更改为使用 Bloc 状态管理来解决,但这与 setState() 具有相同的行为。有什么办法可以避免重建小部件树吗?我无法使用 Selector 小部件,因为我认为它对我没有帮助。

import 'package:flutter/material.dart';
void main()=>runApp(MaterialApp(home: Home(),));

class Home extends StatefulWidget {
@override
State<StatefulWidget> createState() =>HomeState();

}

class HomeState extends State<Home> {
Map<String, bool> _profileExpansionStateMap = Map<String, bool>();

@override
void initState() {
super.initState();
_profileExpansionStateMap = {
"UserInformation": false,
"UserWeight": false,
"UserGeneralInformation": false,
};
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title:Text('ExpansionPanel')),
body: SingleChildScrollView(
child: Container(
padding: EdgeInsets.all(20.0),
child:ExpansionPanelList(
expansionCallback: (int index, bool isExpanded) {
setState(() {
_profileExpansionStateMap[_profileExpansionStateMap.keys.toList()[index]] = !isExpanded;
});
},
children: <ExpansionPanel>[
ExpansionPanel(
headerBuilder: (BuildContext context, bool isExpanded) {
return Container(
height: 80.0,
child: Text('aaaaaaaa'),
);
},
body: Container(child:Text('aaaaaaaa')),
isExpanded: _profileExpansionStateMap["UserInformation"]),
ExpansionPanel(
headerBuilder: (BuildContext context, bool isExpanded) {
return Container(
height: 80.0,
child: Text('bbbbbbbbbbbb'),
);
},
body: Container(child:Text('bbbbbbbbbbbb')),
isExpanded: _profileExpansionStateMap["UserWeight"]),
ExpansionPanel(
headerBuilder: (BuildContext context, bool isExpanded) {
return Container(
height: 80.0,
child: Text('ccccccccc'),
);
},
body: Container(child:Text('ccccccccc')),
isExpanded: _profileExpansionStateMap["UserGeneralInformation"]),
],
)
),
),
);
}
}

最佳答案

ExpansionPanelList.expansionCallback(...) 是一种方法,每当您点击 ExpansionPanelList 内的箭头按钮来展开/折叠它时,就会调用该方法。

在此方法中,您实际上应该设置传递给 ExpansionPanelisExpandedbool 值,因此需要您调用 setState (...)

但是,如果您对此有疑问,那么它清楚地表明您的代码有问题。因此,没有必要避免重建小部件状态。

关于Flutter 避免在折叠/展开 ExpansionPanelList 时重建小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57727691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com