Виджет StatefulBuilder
Виджет StatefulBuilder создаёт анонимный
State
и передаёт в builder функцию
setState.
Удобен для мелких переключений без отдельного StatefulWidget.
Синтаксис
StatefulBuilder(
builder: (context, setState) {
return Text('abcde');
},
)
Параметры
| Параметр | Описание |
|---|---|
builder |
Получает BuildContext и setState для локального State.
|
Пример
Давайте переключим текст через StatefulBuilder:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: SwapBlock(),
),
),
),
);
}
class SwapBlock extends StatefulWidget
{
const SwapBlock({super.key});
@override
State<SwapBlock> createState() => _SwapBlockState();
}
class _SwapBlockState extends State<SwapBlock>
{
var label = 'abcde';
@override
Widget build(BuildContext context)
{
return StatefulBuilder(
builder: (context, setInner) {
return ElevatedButton(
onPressed: () => setInner(() {
label = label == 'abcde' ? '12345' : 'abcde';
}),
child: Text(label),
);
},
);
}
}
На экране StatefulBuilder сменит подпись между 'abcde' и '12345'.
Пример
Давайте вынесем счётчик в переменную вне builder:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: CounterBlock(),
),
),
),
);
}
class CounterBlock extends StatelessWidget
{
const CounterBlock({super.key});
@override
Widget build(BuildContext context)
{
var n = 0;
return StatefulBuilder(
builder: (context, setState) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('$n'),
ElevatedButton(
onPressed: () => setState(() => n++),
child: const Text('abcde'),
),
],
);
},
);
}
}
На экране setState из StatefulBuilder увеличит число по кнопке 'abcde'.