Метод markNeedsBuild
Метод markNeedsBuild класса OverlayEntry
помечает запись: её содержимое нужно собрать заново.
Так обновляют оверлей, когда данные изменились без setState у виджета под слоем.
Синтаксис
entry.markNeedsBuild();
Пример
Давайте обновим OverlayEntry через markNeedsBuild:
import 'package:flutter/material.dart';
void main()
{
runApp(const MaterialApp(home: MarkDemo()));
}
class MarkDemo extends StatefulWidget
{
const MarkDemo({super.key});
@override
State<MarkDemo> createState() => _MarkDemoState();
}
class _MarkDemoState extends State<MarkDemo>
{
OverlayEntry? _entry;
String _label = 'abcde';
void _show()
{
_entry = OverlayEntry(
builder: (ctx) {
return Center(child: Text(_label));
},
);
Overlay.of(context).insert(_entry!);
}
void _refresh()
{
setState(() {
_label = '12345';
});
_entry?.markNeedsBuild();
}
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: _show,
child: Text('abcde'),
),
ElevatedButton(
onPressed: _refresh,
child: Text('12345'),
),
],
),
),
);
}
}
Первая кнопка 'abcde' откроет слой; вторая '12345' сменит текст через markNeedsBuild.
Пример
Давайте перерисуем Positioned запись:
import 'package:flutter/material.dart';
void main()
{
runApp(const MaterialApp(home: MarkPosDemo()));
}
class MarkPosDemo extends StatefulWidget
{
const MarkPosDemo({super.key});
@override
State<MarkPosDemo> createState() => _MarkPosDemoState();
}
class _MarkPosDemoState extends State<MarkPosDemo>
{
late OverlayEntry _entry;
double _top = 40;
@override
void initState()
{
super.initState();
_entry = OverlayEntry(
builder: (ctx) {
return Positioned(
top: _top,
left: 24,
child: Text('abcde'),
);
},
);
}
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
_top = 120;
Overlay.of(context).insert(_entry);
_entry.markNeedsBuild();
},
child: Text('12345'),
),
),
);
}
}
По нажатию '12345' markNeedsBuild сдвинет текст 'abcde' ниже по экрану.
Смотрите также
-
виджет
Overlay,
слой поверх маршрутов -
класс
OverlayState,
управление спискомOverlayEntry -
класс
OverlayEntry,
один виджет в слое -
виджет
OverlayPortal,
слой из обычного виджета