У меня есть TabBarView в моем main.dart, и каждая вкладка имеет класс для отображения содержимого (это объект 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(.......
}





Если я вас хорошо понял, вы жалуетесь на обновление, потому что вам нужно, чтобы представления сохраняли свое состояние после перехода между вкладками. По этому поводу есть открытый вопрос, и в комментариях есть способ обойти эту проблему.
Обновлять:
Существует обходной путь для этой проблемы с помощью AutomaticKeepAliveClientMixin, о котором вы можете узнать больше в этом статья.
МахМус прав, но хорошо, что здесь есть пример ...
`
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
}
Хороший улов, я добавил super.build (context), спасибо!
Ни одно из этих решений не работает для меня
Если вы хотите, чтобы данные вашего представления вкладки не обновлялись при изменении вкладки, вы должны использовать
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;
}
Я столкнулся с той же проблемой, и этот учебник мне помог.
Удачного кодирования.
Для этого: Использование mixin и AutomaticKeepAliveClientMixin в нашем штате.
И реализовать: bool get wantKeepAlive => true;
Примечание: в этом примере wantKeepAlive => true для первой вкладки и wantKeepAlive => 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) {
}
}
похоже, не работает ... сборка все еще вызывается, и мое представление перестраивается
Вы уверены, что это правда, например -> bool get wantKeepAlive => true; Потому что, сделав это, мы даже не сможем восстановить
Спасибо за полезный ответ. Но когда я использую AutomaticKeepAliveClientMixin, метод сборки виджета показывает следующую ошибку: «« Этот метод переопределяет метод, помеченный как '@mustCallSuper' в 'AutomaticKeepAliveClientMixin', но не вызывает переопределенный метод ».