df_tooltip 0.0.1 copy "df_tooltip: ^0.0.1" to clipboard
df_tooltip: ^0.0.1 copied to clipboard

Customizable Flutter tooltip widget that automatically adjusts its position based on available space

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:df_tooltip/df_tooltip.dart';

void main() => runApp(const TooltipExampleApp());

/// Root app showcasing multiple DFTooltip usage scenarios.
class TooltipExampleApp extends StatelessWidget {
  const TooltipExampleApp({super.key});

  @override
  Widget build(BuildContext context) => MaterialApp(
    title: 'DFTooltip Demo',
    debugShowCheckedModeBanner: false,
    theme: ThemeData(
      colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
      useMaterial3: true,
    ),
    home: const DemoHomePage(),
  );
}

class DemoHomePage extends StatefulWidget {
  const DemoHomePage({super.key});
  @override
  State<DemoHomePage> createState() => _DemoHomePageState();
}

class _DemoHomePageState extends State<DemoHomePage>
    with SingleTickerProviderStateMixin {
  late final TabController _tabController = TabController(
    length: 3,
    vsync: this,
  );

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
    appBar: AppBar(
      title: const Text('DFTooltip Examples'),
      bottom: TabBar(
        controller: _tabController,
        tabs: const [
          Tab(text: 'Basic'),
          Tab(text: 'Directions'),
          Tab(text: 'List'),
        ],
      ),
    ),
    body: TabBarView(
      controller: _tabController,
      children: const [BasicExamples(), DirectionExamples(), ListExamples()],
    ),
  );
}

/// Basic styling & customization showcase.
class BasicExamples extends StatelessWidget {
  const BasicExamples({super.key});

  @override
  Widget build(BuildContext context) => SingleChildScrollView(
    padding: const EdgeInsets.all(16),
    child: Wrap(
      spacing: 24,
      runSpacing: 24,
      children: [
        DFTooltip(
          content: const Text(
            'Simple tooltip with default styling',
            style: TextStyle(color: Colors.white),
          ),
          child: ElevatedButton(onPressed: () {}, child: const Text('Default')),
        ),
        DFTooltip(
          preferredDirection: TooltipDirection.down,
          content: const Text(
            'Appears below (preferred down)',
            style: TextStyle(color: Colors.white),
          ),
          child: const Chip(label: Text('Down')),
        ),
        DFTooltip(
          duration: const Duration(seconds: 3),
          content: const Text(
            'Auto hides after 3 seconds',
            style: TextStyle(color: Colors.white),
          ),
          child: const Icon(Icons.timer_outlined, size: 32),
        ),
        DFTooltip(
          bgColor: Colors.blueGrey.shade900.withOpacity(.9),
          borderRadius: BorderRadius.circular(12),
          content: Row(
            mainAxisSize: MainAxisSize.min,
            children: const [
              Icon(Icons.info, color: Colors.white, size: 18),
              SizedBox(width: 8),
              Flexible(
                child: Text(
                  'Custom color & radius',
                  style: TextStyle(color: Colors.white),
                ),
              ),
            ],
          ),
          child: const Icon(Icons.palette_outlined, size: 32),
        ),
        DFTooltip(
          upnDownTooltipWidth: 260,
          content: const Text(
            'Width override for up/down tooltips.',
            style: TextStyle(color: Colors.white),
          ),
          child: const Icon(Icons.width_full, size: 32),
        ),
        DFTooltip(
          sideTooltipWidth: 180,
          preferredDirection: TooltipDirection.right,
          content: const Text(
            'Custom width for side tooltip.',
            style: TextStyle(color: Colors.white),
          ),
          child: const Icon(Icons.swap_horiz, size: 32),
        ),
      ],
    ),
  );
}

/// Shows all directions (auto flips if not enough space).
class DirectionExamples extends StatelessWidget {
  const DirectionExamples({super.key});

  Widget _directionTile(String label, TooltipDirection dir, Color color) =>
      DFTooltip(
        preferredDirection: dir,
        content: Text(
          '$label tooltip',
          style: const TextStyle(color: Colors.white),
        ),
        child: Container(
          width: 80,
          height: 80,
          decoration: BoxDecoration(
            color: color,
            borderRadius: BorderRadius.circular(12),
          ),
          alignment: Alignment.center,
          child: Text(
            label,
            style: const TextStyle(fontWeight: FontWeight.w600),
          ),
        ),
      );

  @override
  Widget build(BuildContext context) => Center(
    child: Wrap(
      spacing: 32,
      runSpacing: 32,
      children: [
        _directionTile('Up', TooltipDirection.up, Colors.indigo.shade100),
        _directionTile('Down', TooltipDirection.down, Colors.indigo.shade100),
        _directionTile('Left', TooltipDirection.left, Colors.indigo.shade100),
        _directionTile('Right', TooltipDirection.right, Colors.indigo.shade100),
      ],
    ),
  );
}

/// Demonstrates auto-hide on scroll.
class ListExamples extends StatelessWidget {
  const ListExamples({super.key});

  @override
  Widget build(BuildContext context) => ListView.separated(
    padding: const EdgeInsets.all(12),
    itemCount: 25,
    separatorBuilder: (_, __) => const Divider(height: 0),
    itemBuilder: (context, index) => ListTile(
      title: Text('Item #$index'),
      trailing: DFTooltip(
        preferredDirection: TooltipDirection.left,
        content: Text(
          'Tooltip for item $index. Scroll to auto-hide.',
          style: const TextStyle(color: Colors.white),
        ),
        child: const Icon(Icons.info_outline),
      ),
    ),
  );
}
1
likes
140
points
13
downloads

Publisher

verified publisherdartforce.dev

Weekly Downloads

Customizable Flutter tooltip widget that automatically adjusts its position based on available space

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter, provider

More

Packages that depend on df_tooltip