#dart #flutter
#dart #флаттер
Вопрос:
Новичок в Flutter, и я использую нижнюю навигацию для переключения содержимого страницы. На основе отладки задается состояние, в котором фиксируется правильный номер индекса и присваивается переменной _selectedPage. Однако, как только я перехожу к этому коду, содержимое страницы остается неизменным без изменения содержимого, а значок «Главная» остается выбранным в нижней навигации, независимо от того, какой значок я выбираю.
Прокомментированные части, в которых я ожидал увидеть разницу при выборе другого значка на панели навигации. Пожалуйста, дайте совет.
import 'package:flutter/material.dart';
class LatestFeed extends StatefulWidget{
@override
State<StatefulWidget> createState() => LatestFeedState();
}
class LatestFeedState extends State<LatestFeed>{
@override
Widget build(BuildContext context) {
int _selectedPage = 0;
List pageOptions = [
Text('one1', style: TextStyle(fontSize: 36),), // Expecting a change but now it always remains on this data. No change even when set state changes to different index.
Text('two', style: TextStyle(fontSize: 36),),
Text('three', style: TextStyle(fontSize: 36),),
Text('four', style: TextStyle(fontSize: 36),)
];
return MaterialApp(
home: new Scaffold(
body: pageOptions[_selectedPage],
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('Home')
),
BottomNavigationBarItem(
icon: Icon(Icons.rss_feed),
title: Text('feed')
),
BottomNavigationBarItem(
icon: Icon(Icons.featured_play_list),
title: Text('list')
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
title: Text('settings')
),
],
currentIndex: _selectedPage, // expecting different icons to be selected based on this index which is being selected in the set state below. Not seeing any change.
onTap: (int index){
setState(() {
_selectedPage = index; // being assigned correctly yet no effect
});
},
),
),
);
}
}
Ответ №1:
Поместите _selectPage и pageOptions в initState или вне вашего метода сборки, чтобы предотвратить перестроение при вызове setState
int _selectedPage;
List<Widget> pageOptions;
@override
void initState() {
super.initState();
_selectedPage = 0;
pageOptions = [
Text('one1', style: TextStyle(fontSize: 36),), // always remains on this data. No change even when set stae changes to different index.
Text('two', style: TextStyle(fontSize: 36),),
Text('three', style: TextStyle(fontSize: 36),),
Text('four', style: TextStyle(fontSize: 36),)
];
}
Всякий раз, когда вы вызываете setState, будут изменения, которые заставят виджеты перестроиться. Это означает, что ваш метод сборки будет вызван снова. Когда он будет вызван, _selectedPage
снова будет установлено значение 0, и pageOptions[0] всегда будет выбранным виджетом.
Комментарии:
1. Я мог бы попробовать, но немного смущен, почему это сработает. Я хочу, чтобы она менялась при установке состояния. Разве это не приведет к блокировке данных, чтобы они никогда не менялись?
2. позвольте мне обновить свой ответ, чтобы лучше объяснить, пока вы его пробуете.
3. Работает, и да, я понимаю вашу точку зрения. Теперь это не заканчивается инициализацией каждый раз и возвратом к исходным настройкам. Спасибо.