首页 > 解决方案 > 更改父部件高度而不导致子部件重建 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();
          }
        });
  }
}

我能做些什么?

标签: flutterdartstatestatefulwidget

解决方案


  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){
         .....
    );
  }

希望这可以帮助你,让我知道这是否有效。


推荐阅读