【问题标题】:Flutter tabview refresh issueFlutter tabview刷新问题
【发布时间】:2018-12-21 12:30:08
【问题描述】:

我的 main.dart 中有一个 TabBarView,每个选项卡都有一个显示内容的类(它是 listview 对象),当我在选项卡之间移动时,listview 页面每次都会刷新,tabbarview 是否正常?我不希望每次在标签之间切换时它都会刷新。

是我班的问题吗?如何解决这个问题?代码是这样的。

    class ListWidget extends StatefulWidget {
  final catID;

  ListWidget(this.catID);


  _ListWidgetState createState() => new _ListWidgetState(catID);
}

class _ListWidgetState extends State<ListWidget> {

  var catID;

  void initState() {
    super.initState();
    _fetchListData();
  }

  @override

  Widget build(BuildContext context) {
    // TODO: implement build

    return new Scaffold(.......
}

【问题讨论】:

    标签: tabs dart flutter tabview


    【解决方案1】:

    MahMoos 是对的,但是这里有一个例子很好......

    1. 使用 AutomaticKeepAliveClientMixin
    2. 覆盖 wantKeepAlive 属性并返回 true

    `

    class ListWidget extends StatefulWidget {
    
      @override
      _ListWidgetState createState() => _ListWidgetState();
    
    }
    
    class _ListWidgetState extends State<ListWidget> with 
                      AutomaticKeepAliveClientMixin<ListWidget>{ // ** here
    
      @override
      Widget build(BuildContext context) {
        super.build(context)
        return Container();
      }
    
      @override
      bool get wantKeepAlive => true; // ** and here
    }
    

    【讨论】:

    • 感谢您的有用回答。但是,当我使用 AutomaticKeepAliveClientMixin 时,小部件的构建方法会显示此错误:““此方法覆盖 'AutomaticKeepAliveClientMixin' 中注释为 '@mustCallSuper' 的方法,但不会调用被覆盖的方法。””
    • 很好,我已经添加了 super.build(context),谢谢!
    • 这些解决方案都不适合我
    【解决方案2】:

    如果我理解你的话,你会抱怨刷新,因为你需要视图在标签之间移动后保存它们的状态。关于这个主题有一个open issue,并且有办法解决 cmets 中提到的这个问题。

    更新:

    使用AutomaticKeepAliveClientMixin 可以解决此问题,您可以在此article 中了解更多信息。

    【讨论】:

      【解决方案3】:

      如果您希望您的 Tab 视图数据在您更改 Tab 时不刷新,您应该使用

      AutomaticKeepAliveClientMixin

      class BaseScreen extends StatefulWidget {
      
        BaseScreen(this.title, this.listener, {Key key}) : super(key: key);
      
      }
      
      class BaseScreenState extends State<BaseScreen> with AutomaticKeepAliveClientMixin {
      
        @override
        Widget build(BuildContext context) {
          screenWidth = MediaQuery.of(context).size.width;
          screenHeight = MediaQuery.of(context).size.height;
          primaryColor = Theme.of(context).primaryColor;
          textTheme = Theme.of(context).textTheme;
          return Scaffold(
            key: scaffoldKey,
            appBar: getAppBar(),
            body: Container(),
          );
        }
      
        @override
        bool get wantKeepAlive => true;
      }
      

      我遇到了同样的问题,this tutorial 帮助了我。

      快乐编码。

      【讨论】:

        【解决方案4】:

        为此:在我们的州使用mixinAutomaticKeepAliveClientMixin

        并实施:bool get wantKeepAlive =&gt; true;

        注意:在此示例中,wantKeepAlive =&gt; true 用于第一个选项卡,wantKeepAlive =&gt; false 用于第二个选项卡。所以你可以很好地看到它是如何工作的。

        class ResidentListScreen extends StatefulWidget {
          @override
          _ResidentListScreenState createState() => _ResidentListScreenState();
        }
        
        class _ResidentListScreenState extends State<ResidentListScreen> with 
        AutomaticKeepAliveClientMixin<ResidentListScreen>{
        
          @override
          bool get wantKeepAlive => true;
        
          @override
          void initState() {
           super.initState();
          }
        
         @override
         Widget build(BuildContext context) { 
        
         }
        }
        

        【讨论】:

        • 似乎不起作用...构建仍在被调用,我的视图已重新构建
        • 你确定你有这个like -> bool get wantKeepAlive => true;因为这样做我们甚至无法进行重建
        猜你喜欢
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 2011-07-10
        • 2011-01-05
        • 2011-08-04
        • 2011-01-12
        相关资源
        最近更新 更多