Я работаю над PageView, и мой просмотр страницы работает нормально. Но есть один, так как я использовал dots_indicator 0.0.4 для представления того, в котором я сейчас нахожусь. Я запутался, как это сделать. Мой индикатор показывает нормально, но проблема в том, как обновить index in the position element to update the active dots
.
Я пытался всеми возможными способами обновить его, но это сбивает меня с толку. Я хочу:
Поскольку я пробовал оба из них, например, создать переменную с именем index и попытаться обновить ее значение, когда мы нажимаем кнопку. Но это не обновило значение.
Я не знаю, как мы предполагаем изменить значение при прокрутке страницы.
У меня есть changePage()
, когда мы нажимаем кнопку, чтобы перейти на следующую страницу, но значение индекса не обновлялось в DotsIndicator()
.
КОД:
class OnboardingPage extends StatelessWidget {
final PageController controller = new PageController();
var index = 0;
final List<OnboardingPageItem> pages = [
//I do have a onboarding page widget which is coming up fine
//so this is not our concern
];
PageView getPages(){
return PageView(
controller: this.controller,
children: this.pages
);
}
//this is a method which controls the button hit for changing the page
changePage(BuildContext context) {
//tried here to update the value of the index by assigning the value to it
//index = this.controller.page.toInt()
if (this.controller.page >= this.pages.length - 1) {
Navigator.pushNamed(context, '/signin');
}
this.controller.nextPage(duration: Duration(milliseconds: 200), curve: Curves.easeIn);
}
@override
Widget build(BuildContext context) {
return Material(
child: Stack(children: <Widget>[
Positioned(
left: 24, right: 24, top: 0, bottom: 80, child: this.getPages()),
Positioned(
child: DotsIndicator(
numberOfDot: 3,
position: this.index,
dotColor: Theme.of(context).primaryColor.withOpacity(0.5),
dotActiveSize: new Size(12.0, 12.0),
dotActiveColor: Theme.of(context).primaryColor
),
bottom: 100.0,
left: 150.0,
right: 150.0
),
Positioned(
child: TMButton(
text: "Next",
onPressed: () {changePage(context);},
),
bottom: 24,
left: 24,
right: 24
)
]));
}
}
ПРАВКИ
Я пытался использовать this.controller.hasClients для обновления, когда он меняется на true, но у меня ничего не получается. Похоже, это статический параметр DotsIndicator.
position: this.controller.hasClients ? this.controller.page.toInt() : this.controller.initialPage;
currentIndex
остается на начальной странице и совсем не меняется.
Любая помощь будет оценена по достоинству. Спасибо :)
как только у вас появится изменяемый состояние (index
) в вашем виджете, вы должны не использовать StatelessWidget
, а создать StatefulWidget
с соответствующим State
. А при изменении index
оберните его в setState(() { index = ... ; });
это гарантирует, что ваш build
метод будет вызван при изменении состояния.
Нет никакой скрытой магии, которая следила бы за вашим состоянием. Ваш виджет будет перестроен только в том случае, если вы позвоните setState
из StatefulWidget
.