Callback от потомка к родителю в Flutter
При подъёме состояния кнопка часто живёт
в отдельном виджете, а менять поле должно
State родителя.
Потомку передают функцию: VoidCallback,
если параметров нет, или ValueChanged<T>,
если нужно вернуть значение.
Внутри build потомка эту функцию
вешают на onPressed. Родитель в
обработчике вызывает setState
и меняет своё поле. Потомок остаётся
«глупым»: он не знает, что именно
произойдёт после нажатия:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int selected = 0;
void choose(int index) {
setState(() {
selected = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Text('Selected item: $selected'),
),
for (var i = 0; i < 3; i++)
ChoiceRow(
label: 'Option ${i + 1}',
onChoose: () => choose(i), // captures this i
),
],
),
);
}
}
class ChoiceRow extends StatelessWidget {
const ChoiceRow({
super.key,
required this.label,
required this.onChoose,
});
final String label;
final VoidCallback onChoose;
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(label),
trailing: ElevatedButton(
onPressed: onChoose,
child: const Text('Choose'),
),
);
}
}
Сделайте StatelessWidget
AddButton с VoidCallback onAdd.
Родитель хранит счётчик и передаёт в
onAdd функцию, которая в setState
увеличивает счётчик. На экране - текст
со значением и ваш AddButton.