Flutter TabView刷新问题

时间:2018-07-13 07:25:10

标签: tabs dart flutter tabview

我的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(.......
}

4 个答案:

答案 0 :(得分:3)

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) {
    return Container();
  }

  @override
  bool get wantKeepAlive => true; // ** and here
}

答案 1 :(得分:1)

如果我对您的理解很好,则您抱怨刷新,因为在选项卡之间移动后,需要视图来保存其状态。在这个问题上有一个open issue,并且有一种方法可以解决注释中提到的这个问题。

答案 2 :(得分:0)

如果您希望在更改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帮助了我。

快乐编码。

答案 3 :(得分:0)

为此:在我们的国家使用mixinAutomaticKeepAliveClientMixin

实施:bool get wantKeepAlive => true;

注意:在此示例中,wantKeepAlive => true代表第一个标签,wantKeepAlive => false代表第二个标签。这样您就可以很好地了解其工作原理。

See my result

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) { 

 }
}