패키지, 저장소 및 앱 카테고리 검색

connection_notifier 표지
패키지 상세v4.1.1

connection_notifier

인터넷 연결이 없을 때 알림을 보내는 Flutter 패키지이며, 인터넷 연결 상태를 추적하는 데 도움이 되는 간단한 도구도 제공합니다.

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
817
좋아요
115
Pub 점수
150

패키지 설치

flutter pub add connection_notifier

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

ConnectionNotifier는 인터넷 연결 상태를 모니터링하고 연결 상태가 변경될 때 실시간으로 업데이트를 제공하는 Flutter 패키지입니다. 인터넷에 접속할 수 없을 경우 사용자에게 즉시 알림을 보내기 때문에 신뢰할 수 있는 네트워크 인식이 필요한 앱에 이상적입니다. 이 패키지는 여러 플랫폼에서 연결 상태 확인 및 연결 이벤트 리스닝을 위한 간단한 API를 제공합니다. Android, iOS, Web, macOS, Windows, Linux를 지원하여 광범위한 호환성을 보장합니다. 사용이 쉬운 설계로, 복잡한 설정 없이도 개발자가 견고한 네트워크 처리 기능을 구현할 수 있도록 도와줍니다.

사용 사례

  • 실시간 네트워크 상태 모니터링
  • 앱에서 오프라인 시나리오 처리
  • 네트워크 요청에 대한 자동 재시도 로직
  • 연결 상태 UI 요소 표시
  • 온라인 상태일 때만 데이터 동기화 보장
  • 연결 변경 시 사용자 경험 개선

주요 기능

  • 즉시 연결 변경 알림
  • 연결성 확인을 위한 간단한 API
  • 크로스 플랫폼 지원
  • 경량이며 쉽게 통합 가능
  • 이벤트 기반 아키텍처
  • 내장 상태 추적

적합한 대상

  • 신뢰할 수 있는 네트워크 감지가 필요한 앱
  • 연결성 검사를 위한 최소 설정을 원하는 개발자
  • 자주 네트워크 작업을 수행하는 프로젝트
  • 명확한 연결 피드백이 필요한 사용자 중심 앱
  • 크로스 플랫폼 일관성을 우선시하는 팀

고려 사항

  • 모바일 플랫폼에서는 인터넷 권한이 필요합니다
  • 예외적인 경우를 처리하기 위해 추가적인 오류 처리가 필요할 수 있습니다
  • 고주파 폴링 시나리오에 적합하지 않습니다
  • 기본적인 연결성 검사에 국한됨(세부 네트워크 메트릭 없음)

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

Connection Notifier

A simple way to notify your user about the connection status as well as providing simple tools that help tracking the internet connection status.

Version 4.0+: Now with injectable connectivity handlers, full Navigator 2.0 support, Web support, and seamless support for modern routing solutions. Version 4.1+: Added async connectivity check via ConnectionNotifierTools.isConnectedAsync.

Gallery

Quick Start

Basic Usage (Without Localization)

If you don't need localization, simply wrap your MaterialApp:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await ConnectionNotifierTools.initialize();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GlobalConnectionNotifier(
      connectionNotificationOptions: ConnectionNotificationOptions(
        alignment: Alignment.topCenter,
      ),
      child: MaterialApp(
        title: 'My App',
        home: const MyHomePage(),
      ),
    );
  }
}
Recommended Usage (With Localization)

This is the recommended approach if you're using any localization package (EasyLocalization, flutter_localizations, intl, etc.):

Call ConnectionNotifierTools.initialize(...) once in main() before runApp(...), same as the basic usage example.

import 'package:connection_notifier/connection_notifier.dart';
import 'package:easy_localization/easy_localization.dart'; // or your localization package
import 'package:flutter/material.dart';

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: context.locale,
      supportedLocales: context.supportedLocales,
      localizationsDelegates: context.localizationDelegates,
      builder: (context, child) => GlobalConnectionNotifier(
        connectionNotificationOptions: ConnectionNotificationOptions(
          alignment: Alignment.bottomCenter,
          // Now you can use localized strings with context!
          connectedText: 'connectionRestored'.tr(context: context),
          disconnectedText: 'connectionLost'.tr(context: context),
        ),
        child: child!,
      ),
      home: const MyHomePage(),
    );
  }
}

Why use the builder approach?

  • ✅ Full access to localization context
  • ✅ Messages automatically update when language changes
  • ✅ Works with EasyLocalization, flutter_localizations, intl, and all localization packages
  • ✅ Clean and maintainable code

That's it! Connection notifications will work throughout your entire app with full localization support.

✅ Platform Support

Works everywhere:

  • ✅ iOS
  • ✅ Android
  • ✅ Web
  • ✅ macOS
  • ✅ Windows
  • ✅ Linux

✅ Navigation Support

Works with ALL navigation types:

  • ✅ Classic Navigator (Navigator 1.0)
  • ✅ Navigator 2.0 (GoRouter, AutoRoute, Beamer, and all modern routing solutions)
Example with GoRouter
import 'package:go_router/go_router.dart';

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  final _router = GoRouter(
    routes: [
      GoRoute(path: '/', builder: (context, state) => const HomePage()),
      GoRoute(path: '/details', builder: (context, state) => const DetailsPage()),
    ],
  );

  @override
  Widget build(BuildContext context) {
    return GlobalConnectionNotifier(
      connectionNotificationOptions: ConnectionNotificationOptions(
        alignment: Alignment.topCenter,
      ),
      child: MaterialApp.router(
        title: 'My App',
        routerConfig: _router,
      ),
    );
  }
}

Configuration

ConnectionNotificationOptions Parameters
Option Description Type Default Value Required
alignment Alignment of the connection notification AlignmentGeometry AlignmentDirectional.topCenter No
height Height of the connection notification double? twice top padding No
width Width of the connection notification double? double.infinity No
borderRadius Border radius of the connection notification BorderRadiusGeometry? null No
connectedBackgroundColor Background color in connected state Color? Colors.green No
disconnectedBackgroundColor Background color in disconnected state Color? Colors.red No
connectedDuration Duration before auto-dismissing in connected state Duration? 2 seconds No
disconnectedDuration Duration before auto-dismissing in disconnected state Duration? infinity No
overlayAnimationType Animation type of the notification OverlayAnimationType OverlayAnimationType.fadeAndSlide No
animationCurve Animation curve Curve? Curves.fastOutSlowIn No
animationDuration Animation duration Duration? 300 milliseconds No
connectedContent Custom widget for connected state Widget? null No
disconnectedContent Custom widget for disconnected state Widget? null No
shouldAlwaysPullContentDownOnTopAlignment Pull content down on top alignment bool true No
hasIndicationIcon Show indication icon in default content bool true No
textAndIconSeparationWidth Distance between text and icon double? 10 No
connectedText Text for connected state String? 'Back Online' No
disconnectedText Text for disconnected state String? 'Retrying' No
connectedTextStyle Text style for connected state TextStyle? null No
disconnectedTextStyle Text style for disconnected state TextStyle? null No
connectedIcon Icon for connected state Icon? Icon(Icons.check) No
disconnectedIcon Icon for disconnected state Icon? CircularProgressIndicator No
iconBoxSideLength Size of the icon box double? 10 No
connectedConnectionNotification Custom notification widget for connected state Widget? null No
disconnectedConnectionNotification Custom notification widget for disconnected state Widget? null No
Custom Notification Example
GlobalConnectionNotifier(
  connectionNotificationOptions: ConnectionNotificationOptions(
    alignment: Alignment.topCenter,
    connectedConnectionNotification: Container(
      padding: const EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: Colors.green,
        borderRadius: BorderRadius.circular(8),
      ),
      child: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          const Icon(Icons.wifi, color: Colors.white),
          const SizedBox(width: 8),
          const Text('Connected', style: TextStyle(color: Colors.white)),
        ],
      ),
    ),
    disconnectedConnectionNotification: Container(
      padding: const EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: Colors.red,
        borderRadius: BorderRadius.circular(8),
      ),
      child: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          const Icon(Icons.wifi_off, color: Colors.white),
          const SizedBox(width: 8),
          const Text('No Connection', style: TextStyle(color: Colors.white)),
        ],
      ),
    ),
  ),
  child: MaterialApp(home: MyHomePage()),
)

Localization

Recommended Approach: Use MaterialApp Builder (Best Practice)

The easiest and most powerful way to handle localization is using the MaterialApp builder pattern. This gives you full access to the localization context:

import 'package:connection_notifier/connection_notifier.dart';
import 'package:easy_localization/easy_localization.dart'; // or any localization package
import 'package:flutter/material.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: context.locale,
      supportedLocales: context.supportedLocales,
      localizationsDelegates: context.localizationDelegates,
      // Use the builder to access localization context
      builder: (context, child) => GlobalConnectionNotifier(
        connectionNotificationOptions: ConnectionNotificationOptions(
          alignment: Alignment.bottomCenter,
          // Access localized strings with full context support
          connectedText: 'connectionRestored'.tr(context: context),
          disconnectedText: 'connectionLost'.tr(context: context),
        ),
        child: child!,
      ),
      home: const MyHomePage(),
    );
  }
}

Benefits:

  • ✅ Works with any localization package (EasyLocalization, flutter_localizations, intl, etc.)
  • ✅ Messages automatically update when language changes
  • ✅ Full access to localization context
  • ✅ Clean and maintainable
  • ✅ No need for custom widgets or manual locale detection
Alternative: Custom Notification Widgets

If you need more control over the UI, create custom widgets:

GlobalConnectionNotifier(
  connectionNotificationOptions: ConnectionNotificationOptions(
    connectedConnectionNotification: MyLocalizedConnectedWidget(),
    disconnectedConnectionNotification: MyLocalizedDisconnectedWidget(),
  ),
  child: MaterialApp(...),
)

class MyLocalizedConnectedWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final String message = 'connectionRestored'.tr(context: context);
    
    return Container(
      padding: EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: Colors.green,
        borderRadius: BorderRadius.circular(8),
      ),
      child: Text(message, style: TextStyle(color: Colors.white)),
    );
  }
}

Additional Widgets

ConnectionNotifierToggler

Toggle between widgets based on connection state:

ConnectionNotifierToggler(
  onConnectionStatusChanged: (connected) {
    if (connected == null) return; // Still initializing
    print(connected);
  },
  connected: Center(
    key: UniqueKey(),
    child: const Text(
      'Connected',
      style: TextStyle(color: Colors.green, fontSize: 48),
    ),
  ),
  disconnected: Center(
    key: UniqueKey(),
    child: const Text(
      'Disconnected',
      style: TextStyle(color: Colors.red, fontSize: 48),
    ),
  ),
);
LocalConnectionNotifier

Show connection notification for a specific screen only:

class MyScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return LocalConnectionNotifier(
      connectionNotificationOptions: const ConnectionNotificationOptions(
        alignment: Alignment.bottomCenter,
      ),
      child: Scaffold(
        appBar: AppBar(title: const Text('My Screen')),
        body: Center(child: Text('Content')),
      ),
    );
  }
}
ConnectionNotifierTools

Check connection status programmatically anywhere in your app:

First, initialize:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await ConnectionNotifierTools.initialize();
  runApp(const MyApp());
}

Then use:

// Check if connected (synchronous, last known status)
bool isConnected = ConnectionNotifierTools.isConnected;

// Async live check — use when you need a guaranteed up-to-date result,
// since isConnected may briefly hold stale data during a connection change.
bool isOnline = await ConnectionNotifierTools.isConnectedAsync;

// Listen to connection changes
ConnectionNotifierTools.onStatusChange.listen((isConnected) {
  print('Connection status: $isConnected');
});
Custom Connection Handler (Inject Your Own Connectivity Source)

The package is agnostic to how connectivity is detected. By default it uses ConnectionNotifierHandlerImpl (internet_connection_checker_plus). If you have your own source (socket, native SDK, etc.), implement ConnectionHandler and pass it to ConnectionNotifierTools.initialize(...).

import 'package:connection_notifier/connection_notifier.dart';

class MySocketConnectionHandler implements ConnectionHandler {
  @override
  Stream<ConnectionNotifierInternetConnectionStatus> get onStatusChange =>
      mySocketStatusStream.map((isOnline) {
        return isOnline
            ? ConnectionNotifierInternetConnectionStatus.connected
            : ConnectionNotifierInternetConnectionStatus.disconnected;
      });

  @override
  Future<bool> get hasInternetAccess async => mySocketIsConnected;
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await ConnectionNotifierTools.initialize(
    connectionHandler: MySocketConnectionHandler(),
  );
  runApp(const MyApp());
}

The package UI reacts to the handler stream. No manual notification API calls are required.

Migration Guide

From v3.x to v4.0

Version 4.0 introduces breaking changes. Please read below.

What's Changed:
  1. Removed pauseConnectionListenerWhenAppInBackground — Background/foreground lifecycle is now managed internally
  2. Injectable ConnectionHandler support — Bring your own connectivity source
  3. Automatic, stable reconnect flow — App pauses in background, resumes with 3s delay in foreground
Migration Steps:

Step 1: Remove pauseConnectionListenerWhenAppInBackground

If you were using this option, simply remove it:

// ❌ Before (v3.0):
GlobalConnectionNotifier(
  connectionNotificationOptions: ConnectionNotificationOptions(
    alignment: Alignment.topCenter,
    pauseConnectionListenerWhenAppInBackground: true, // ← REMOVE THIS
  ),
  child: MaterialApp(...),
)

// ✅ After (v4.0):
GlobalConnectionNotifier(
  connectionNotificationOptions: ConnectionNotificationOptions(
    alignment: Alignment.topCenter,
    // Background/foreground is handled automatically now
  ),
  child: MaterialApp(...),
)

Step 2: (Optional) Use custom connectivity source

New in v4.0: bring your own connectivity handler:

class MyCustomHandler implements ConnectionHandler {
  @override
  Stream<ConnectionNotifierInternetConnectionStatus> get onStatusChange {
    // Your custom connectivity source
    return myCustomConnectivityStream;
  }

  @override
  Future<bool> get hasInternetAccess async {
    // Your custom connectivity check
    return myCustomCheckInternet();
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await ConnectionNotifierTools.initialize(
    connectionHandler: MyCustomHandler(), // ← Inject your handler
  );
  runApp(const MyApp());
}
Behavior Changes:
Behavior v3.0 v4.0
Background handling Optional, manual via option Always active, automatic
Resume delay None 3 seconds (for OS to settle)
Status deduplication No Yes (same status ignored)
Custom connectivity No Yes, via ConnectionHandler injection

From v2.x to v3.0

See CHANGELOG.md for detailed migration instructions.

Quick Migration:

Before (v2.x):

ConnectionNotifier(
  locale: const Locale('en', 'US'),
  supportedLocales: [Locale('en', 'US')],
  localizationsDelegates: [...],
  connectionNotificationOptions: ConnectionNotificationOptions(...),
  child: MaterialApp(
    home: MyHomePage(),
  ),
)

After (v3.0):

GlobalConnectionNotifier(
  connectionNotificationOptions: ConnectionNotificationOptions(...),
  child: MaterialApp(
    locale: const Locale('en', 'US'),
    supportedLocales: [Locale('en', 'US')],
    localizationsDelegates: [...],
    home: MyHomePage(),
  ),
)

Migration Steps:

  1. Replace ConnectionNotifier with GlobalConnectionNotifier
  2. Move locale properties to MaterialApp: locale, supportedLocales, localizationsDelegates, etc.
  3. Keep connectionNotificationOptions in GlobalConnectionNotifier
  4. Handle localization using one of the methods described in the Localization section
  5. Test your app!

Complete Example

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await ConnectionNotifierTools.initialize();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GlobalConnectionNotifier(
      connectionNotificationOptions: ConnectionNotificationOptions(
        alignment: Alignment.topCenter,
        height: 60,
        connectedBackgroundColor: Colors.green,
        disconnectedBackgroundColor: Colors.red,
        connectedText: 'Back Online!',
        disconnectedText: 'No Internet Connection',
        connectedDuration: const Duration(seconds: 3),
      ),
      child: MaterialApp(
        title: 'Connection Notifier Demo',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Connection Notifier Demo')),
      body: ConnectionNotifierToggler(
        connected: Center(
          child: const Text(
            'Connected',
            style: TextStyle(color: Colors.green, fontSize: 48),
          ),
        ),
        disconnected: Center(
          child: const Text(
            'Disconnected',
            style: TextStyle(color: Colors.red, fontSize: 48),
          ),
        ),
      ),
    );
  }
}

Attribution

This package depends on the following (Big Thanks):

More from the Developer

Check out my other open-source project:

  • workspace-bridge-mcp — An MCP server that bridges AI coding agents with multi-project workspaces, enabling cross-project file access, git history, and more.

License

MIT License

카테고리

의존성

의존성 목록 2 개

소스 저장소

이 패키지를 사용하는 프로젝트

아직 데이터가 없습니다.