Android 颤振:默认选项卡栏控制器在滑动后不保持状态

Android 颤振:默认选项卡栏控制器在滑动后不保持状态,android,ios,dart,flutter,Android,Ios,Dart,Flutter,我正在用flatter编写一个应用程序,它有4个选项卡式视图,有点像股票android手机应用程序或时钟应用程序。其中一个视图散列了一个浮动操作按钮,按下该按钮将在列表中添加一些文本。然而,当我滚动到另一个视图并返回时,所有文本都消失了。有办法解决这个问题吗 这是我的密码: import 'package:flutter/material.dart'; import 'Screens/Dashboard.dart'; import 'Screens/CreateQuestionnaire.dar

我正在用flatter编写一个应用程序,它有4个选项卡式视图,有点像股票android手机应用程序或时钟应用程序。其中一个视图散列了一个浮动操作按钮,按下该按钮将在列表中添加一些文本。然而,当我滚动到另一个视图并返回时,所有文本都消失了。有办法解决这个问题吗

这是我的密码:

import 'package:flutter/material.dart';
import 'Screens/Dashboard.dart';
import 'Screens/CreateQuestionnaire.dart';
import 'Screens/AccountScreen.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override
 createState() => new MyAppState();
}

class MyAppState extends State<MyApp> {
  final primaryColour = const Color(0xFF5CA1CA);
  final secondaryColour = const Color(0xFFC36B42);
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new DefaultTabController(
        length: 4,
        child: new Scaffold(
          appBar: new AppBar(
            actions: <Widget>[
              new IconButton(icon: new Icon(Icons.account_circle),
              onPressed: (){
                Navigator.push(context, new MaterialPageRoute(builder: (context) => new AccountScreen()));
              }),
            ],
            bottom: new TabBar(
              tabs: <Widget>[
                new Tab(icon: new Icon(Icons.home)),
                new Tab(icon: new Icon(Icons.contacts)),
                new Tab(icon: new Icon(Icons.description)),
                new Tab(icon: new Icon(Icons.settings))
              ],
            ),
            title: new Text("NLPro Questionnaire"),
          ),
          body: new TabBarView(
            children: <Widget>[
              new Dashboard(),
              new CreateQuestionnaire(),
              new Text("Surveys"),
              new Text("Settings")
            ],
          ),
        ),
      ),
      theme:new ThemeData(
        primaryColor: primaryColour,
        accentColor: secondaryColour,
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“Screens/Dashboard.dart”;
导入“Screens/createquestionly.dart”;
导入“Screens/AccountScreen.dart”;
void main()=>runApp(新的MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
createState()=>新建MyAppState();
}
类MyAppState扩展了状态{
最终原色=恒定颜色(0xFF5CA1CA);
最终二次颜色=常量颜色(0xFFC36B42);
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新的DefaultTabController(
长度:4,
儿童:新脚手架(
appBar:新的appBar(
行动:[
新图标按钮(图标:新图标,
已按下:(){
push(context,newmaterialpage(builder:(context)=>newaccountscreen());
}),
],
底部:新选项卡栏(
选项卡:[
新建选项卡(图标:新建图标(Icons.home)),
新建选项卡(图标:新建图标(Icons.contacts)),
新建选项卡(图标:新建图标(Icons.description)),
新建选项卡(图标:新建图标(图标.设置))
],
),
标题:新文本(“NLPro调查问卷”),
),
正文:新选项卡视图(
儿童:[
新建仪表板(),
新建CreateQuestion(),
新文本(“调查”),
新文本(“设置”)
],
),
),
),
主题:新主题数据(
原色:原色,
accentColor:SecondaryColor,
),
);
}
}

在有状态小部件中创建的颤振中的变量会随着状态的变化而更新。当您转到另一个视图,然后再返回时,状态会发生变化。 所以你可以定义两个变量。一个临时的,只是为了布局和一个是保持更长的存储时间。伪代码:

var globalVar;
Stateful Widget...
var _temp;
setState({_temp=yourData; globalVar=yourData})
doSomethingWithYourText(_temp != null ? _temp : globalVar)
当您使用
\u temp
变量进行所有布局更新时。在状态重置(您更改为另一个视图)之前,无法注意到globalVar的更改


这样做的目的是将数据保存在两个变量中,并检查之前是否使用过状态。如果没有,它将使用先前保存的var。

您需要使用PageStorage小部件和PageStoageBucket,并将页面包装在PageStorage小部件中

有关更多详细信息,请参阅本教程:

您需要在有状态小部件上使用AutomaticEpaLiveClientMixin,并实现名为wantKeepAlive的覆盖方法

class MyApp extends StatefulWidget {
@override
createState() => new MyAppState();
}
将AutomaticEpaLiveClientMixin与类扩展状态和ov一起使用

class MyAppState extends State<MyApp> with AutomaticKeepAliveClientMixin<MyApp>{

//your existing code.....

@override
bool get wantKeepAlive => true;   //by default it will be null, change it to true.

//your existing code......

}
类MyAppState使用AutomaticEpaLiveClientMixin扩展状态{
//您现有的代码。。。。。
@凌驾
bool get wantKeepAlive=>true;//默认情况下为null,将其更改为true。
//您现有的代码。。。。。。
}
将wantKeepAlive设置为true时,initState方法将仅在创建时运行一次。

class\u RepoInfoState使用AutomaticKeepAliveClientMixin扩展状态{
@凌驾
bool get wantKeepAlive=>true;//注意这里
@凌驾
小部件构建(构建上下文){
super.build(context);//注意这里
返回文本('嘿');
}
}

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。-是的,你说得对。我已用解决方案的概述更新了我的答案。我也尝试过此方法,但不起作用。是否继续我已经创建了一些类型的数据,可以让它工作吗?请您在回答中添加一些解释性说明以帮助其他人。您应该使用上述AutomaticEpaLiveClientMixin创建一个小部件。然后在TabBarView中使用它。解决了这个问题。如果它工作,请看这个,因为我认为应该这样做:-