Я разработчик флаттера начального уровня, и я некоторое время застрял в этой проблеме, я пробовал разные вещи.
Я пытаюсь сделать «Заголовок заметки» (этот конкретный виджет), всплывающим
тогда это должно отображаться вместо желаемый результат
Два разных содержимого на вкладке «Мои заметки» — это два виджета с отслеживанием состояния, а вкладка «Мои заметки» — это еще один виджет с отслеживанием состояния.
Я пытался использовать функцию, но она не работает
enum MyNoteContent {
staticNote,
dynamicNote,
}
MyNoteContent selectedContent = MyNoteContent.staticNote;
Widget updateMyNotes() {
if (selectedContent == MyNoteContent.staticNote) {
return MyNoteStatic();
} else {
return MyNoteDynamic();
}
}
а затем я вызываю функцию в виджете MyNotes
class _MyNotesTabState extends State<MyNotesTab> {
@override
Widget build(BuildContext context) {
return updateMyNotes();
}
}
Я пытаюсь обновить значение в первом отображаемом содержимом (в своем собственном виджете), чтобы при нажатии оно должно было измениться.
class _MyNoteStaticState extends State<MyNoteStatic> {
@override
Widget build(BuildContext context) {
return Container(
child: RawMaterialButton(
onPressed: () {
setState(() {
selectedContent = MyNoteContent.dynamicNote;
updateMyNotes();
});
},
Но это не работает
Я только что добавил это. Это ссылка на GitHubGist.
Вставьте полный пример прямо в свой вопрос и постарайтесь удалить как можно больше лишнего кода.
setState не влияет на другие виджеты!
@Yadu Это не очень точно. Вызов setState
у дочернего элемента не может напрямую повлиять на родителя, но обратный вызов создаст эффект.
Я перефразирую это, setState — это функция, которая принадлежит классу State, при вызове она перестроит состояние виджета, которому она принадлежит, она может перестроить дочерние элементы, но определенно не перестроит родителя, если вы не найдете так, как @ChristopherMoore ответил, чтобы восстановить родителя на основе отзывов ребенка
@Yadu Я думаю, теперь я понял логику. Спасибо за вклад.
Проблема здесь в том, что setState
вы звоните для класса _MyNoteStaticState
. Это означает, что он будет перестраивать только виджет MyNoteStatic
. Но для того, чтобы страница изменилась, нужно пересобрать ее родителя _MyNotesTabState
. Поэтому вам нужно вызвать метод setState
для _MyNotesTabState
, что можно сделать, передав обратный вызов от _MyNotesTabState
к _MyNoteStaticState
.
Во-первых, переместите updateMyNotes
и selectedContent
в класс _MyNotesTabState
, так как это единственное место, где они нужны.
Создайте новую функцию, которая перестраивает _MyNotesTabState
и изменяет selectedContent
в _MyNotesTabState
.
void changeNote() {
setState(() {
selectedContent = MyNoteContent.dynamicNote;
});
}
Передайте это MyNoteStatic
Widget updateMyNotes() {
if (selectedContent == MyNoteContent.staticNote) {
return MyNoteStatic(changeNote);
} else {
return MyNoteDynamic();
}
}
и измените MyNoteStatic
, чтобы принять этот обратный вызов в качестве параметра
class MyNoteStatic extends StatefulWidget {
final VoidCallback callback;
MyNoteStatic(this.callback);
@override
_MyNoteStaticState createState() => _MyNoteStaticState();
}
Затем передайте этот обратный вызов вашей кнопке вместо того, что у вас есть сейчас:
child: RawMaterialButton(
onPressed: widget.callback,
)
Полный соответствующий код, включающий вышеуказанные изменения:
enum MyNoteContent {
staticNote,
dynamicNote,
}
class MyNotesTab extends StatefulWidget {
@override
_MyNotesTabState createState() => _MyNotesTabState();
}
class _MyNotesTabState extends State<MyNotesTab> {
MyNoteContent selectedContent = MyNoteContent.staticNote;
@override
Widget build(BuildContext context) {
return updateMyNotes();
}
Widget updateMyNotes() {
if (selectedContent == MyNoteContent.staticNote) {
return MyNoteStatic(changeNote);
} else {
return MyNoteDynamic();
}
}
void changeNote() {
setState(() {
selectedContent = MyNoteContent.dynamicNote;
});
}
}
//Static Note
class MyNoteStatic extends StatefulWidget {
final VoidCallback callback;
MyNoteStatic(this.callback);
@override
_MyNoteStaticState createState() => _MyNoteStaticState();
}
class _MyNoteStaticState extends State<MyNoteStatic> {
@override
Widget build(BuildContext context) {
return Container(
child: RawMaterialButton(
onPressed: widget.callback,
...
@davidn Также, пожалуйста, попробуйте отредактировать свой код непосредственно в своем вопросе, чтобы это могло принести больше пользы будущим пользователям.
Пожалуйста, создайте минимальный воспроизводимый пример. Немного неясно, какой код у вас сейчас есть. Сделайте что-то, что мы можем вставить в Dartpad и показать проблему.