Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
882 of 1024 menu
◀ ▶

Метод 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' ниже по экрану.

Смотрите также

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить