/
magnusroot
/
flutter
Обзор
Документация
Войти
/
magnusroot
/
flutter
Код
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
examples/multiple_windows/lib/app/tooltip_button.dart
108 строк
3 KB
Tong Mu
[flutter/flutter] Migrate multiple_windows example to material_ui (#190313)
31 июл 2026, 00:49
Не верифицирован
31 июл 2026, 00:49
7f24a41
Код
Авторство
О чём код?
// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // ignore_for_file: invalid_use_of_internal_member // ignore_for_file: implementation_imports import 'package:flutter/src/widgets/_window.dart'; import 'package:material_ui/material_ui.dart'; import 'element_position_tracker.dart'; import 'models.dart'; import 'tooltip_window_content.dart'; class TooltipButton extends StatefulWidget { const TooltipButton({super.key, required this.parentController}); final BaseWindowController parentController; @override State<TooltipButton> createState() => _TooltipButtonState(); } class _TooltipButtonState extends State<TooltipButton> { WindowEntry? _tooltipEntry; ElementPositionTracker? _tooltipTracker; final GlobalKey _tooltipButtonKey = GlobalKey(); @override void dispose() { _tooltipTracker?.dispose(); super.dispose(); } void _onPressed(WindowSettings windowSettings) { // Toggle tooltip visibility. if (_tooltipEntry != null) { _tooltipEntry!.controller.destroy(); _tooltipTracker?.dispose(); setState(() { _tooltipEntry = null; _tooltipTracker = null; }); } else { // Tooltip is not shown, show it. final tracker = ElementPositionTracker(element: _tooltipButtonKey.currentContext!); late final WindowEntry entry; final controller = TooltipWindowController( anchorRect: tracker.getGlobalRect()!, positioner: windowSettings.positioner, delegate: _TooltipWindowControllerDelegate( onDestroyed: () { tracker.dispose(); if (mounted) { setState(() { _tooltipEntry = null; _tooltipTracker = null; }); } }, ), parent: widget.parentController, ); entry = WindowEntry( controller: controller, builder: (BuildContext context) => TooltipWindowContent(controller: controller), ); tracker.onGlobalRectChange = (rect) { controller.updatePosition(anchorRect: rect); }; setState(() { _tooltipEntry = entry; _tooltipTracker = tracker; }); } } @override Widget build(BuildContext context) { final WindowSettings windowSettings = WindowSettingsAccessor.of(context); return OutlinedButton( key: _tooltipButtonKey, onPressed: () => _onPressed(windowSettings), child: ViewAnchor( view: _tooltipEntry != null ? View( view: _tooltipEntry!.controller.rootView, child: Builder(builder: _tooltipEntry!.builder), ) : null, child: Text(_tooltipEntry != null ? 'Hide Tooltip' : 'Show Tooltip'), ), ); } } class _TooltipWindowControllerDelegate extends TooltipWindowControllerDelegate { _TooltipWindowControllerDelegate({required this.onDestroyed}); @override void onWindowDestroyed() { onDestroyed(); super.onWindowDestroyed(); } final VoidCallback onDestroyed; }