flutter - 更改父部件高度而不导致子部件重建 Flutter
问题描述
我有一个父小部件是 aContainer()
和一个子小部件是FutureBuilder
...
在我的应用程序中,我需要更改容器的高度,使其适合新添加的项目,FutureBuilder
但问题是当我setState
更改父小部件的 ( Container()'s
) 高度FutureBuilder
时,将再次重建
现在,这是可以预料的,并且是正常行为......
现在的问题。如何防止我孩子的小部件重建并仅重建父小部件?
就像一种将数据保存到 RAM 或其他东西的方法......
另外,我正在使用AutomaticKeepAliveClientMixin
但无济于事;
这是我的代码
Parent
\\ Somewhere here I call setState and change the value of _latestPostsHeight
Container(
child: LatestPosts(),
height: _latestPostsHeight,
),
这是我LatestPosts()
的FutureBuilder
class _LatestPostsState extends State<LatestPosts>
with AutomaticKeepAliveClientMixin {
bool get wantKeepAlive => true;
bool _isFirstTime = true;
Future<List<Post>> _posts() async {
final Future<List<Post>> _posts =
context.read(fetchPostsProvider({'perPage': 5, 'pageNum': 1}).future);
return _posts;
}
@override
Widget build(BuildContext context) {
super.build(context);
return FutureBuilder(
future: _posts(),
builder: (BuildContext context, AsyncSnapshot<List<Post>> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Column(
children: [
for (var i = 0; i < 7; i++) PostShimmer(),
],
);
} else if (snapshot.connectionState == ConnectionState.done) {
if (_isFirstTime) {
SchedulerBinding.instance
.addPostFrameCallback((_) => setState(() {
_isFirstTime = false;
final boolProvider =
context.read(latestPostsDataLoaded);
boolProvider.state = true;
}));
}
return Column(
children: [
for (var i = 0; i < snapshot.data.length; i++)
SimplePostContainer(
data: snapshot.data, index: i, type: SearchOrPost.post)
],
);
} else {
return Container();
}
});
}
}
我能做些什么?
解决方案
bool futureCalled = false;
Future post(){
setState(() {
futureCalled = true;
});
}
Widget build(BuildContext context) {
return Container(
height:containerHeight ,
child: FutureBuilder(
future: futureCalled ? null : post(), //handle child redraw
builder: (BuildContext context, snapshot){
.....
);
}
希望这可以帮助你,让我知道这是否有效。
推荐阅读
- c# - 如何使用 web 服务从用户控件使 jquery 自动完成工作
- vue.js - 在以编程方式创建的孩子中观看道具更新
- c++ - 在 C++ 中尝试从 Windows 10 中的 UNC 运行 EXE。C++ 非常新
- c# - 用于对来自 C# 应用程序的数据执行大量计算的 Azure 服务
- c++ - std::regex::multiline 不存在
- excel - 从 Google 搜索中获取图片链接
- python-3.x - Pandas:使用所需列顺序的列名数组,选择那些存在的,NULL那些不存在的
- r - ICD-10 变量重新编码
- angular - 使用 unprotectedResources 与 Angular 集成的 MSAL
- java - 带有子查询的 Spring JPA 投影问题