Widgets

Connective

Introduction

Nylo Website provides connectivity-aware widgets and utilities to help you build apps that respond to network changes. The Connective widget automatically rebuilds when connectivity changes, while the NyConnectivity helper provides static methods for checking connection status.

Connective Widget

The Connective widget listens to connectivity changes and rebuilds based on the current network state.

State-Based Builders

Provide different widgets for each connection type:

Connective(
  onWifi: Text('Connected via WiFi'),
  onMobile: Text('Connected via Mobile Data'),
  onNone: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      Icon(Icons.wifi_off, size: 64),
      Text('No internet connection'),
    ],
  ),
  child: Text('Connected'), // Default for unspecified states
)

Available States

Property Description
onWifi Widget when connected via WiFi
onMobile Widget when connected via mobile data
onEthernet Widget when connected via Ethernet
onVpn Widget when connected via VPN
onBluetooth Widget when connected via Bluetooth
onOther Widget for other connection types
onNone Widget when offline
child Default widget if no specific handler is provided

Custom Builder

Use Connective.builder for full control over the UI:

Connective.builder(
  builder: (context, state, results) {
    if (state == NyConnectivityState.none) {
      return Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Icon(Icons.cloud_off, size: 64, color: Colors.grey),
            SizedBox(height: 16),
            Text('You are offline'),
            ElevatedButton(
              onPressed: () => Navigator.pop(context),
              child: Text('Go Back'),
            ),
          ],
        ),
      );
    }

    // Show connection type
    return Text('Connected via: ${state.name}');
  },
)

The builder receives:

  • context - BuildContext
  • state - NyConnectivityState enum (wifi, mobile, ethernet, vpn, bluetooth, other, none)
  • results - List<ConnectivityResult> for checking multiple connections

Listening to Changes

Use onConnectivityChanged to react when connectivity changes:

Connective(
  onConnectivityChanged: (state, results) {
    if (state == NyConnectivityState.none) {
      showSnackbar('You went offline');
    } else {
      showSnackbar('Back online!');
    }
  },
  child: MyContent(),
)

OfflineBanner Widget

Display a banner at the top of the screen when offline:

Scaffold(
  body: Stack(
    children: [
      // Your main content
      MyPageContent(),

      // Offline banner (auto-hides when online)
      OfflineBanner(),
    ],
  ),
)

Customizing the Banner

OfflineBanner(
  message: 'Check your connection',
  backgroundColor: Colors.orange,
  textColor: Colors.white,
  icon: Icons.signal_wifi_off,
  height: 50,
  animate: true, // Slide in/out animation
  animationDuration: Duration(milliseconds: 200),
)

NyConnectivity Helper

The NyConnectivity class provides static methods for checking connectivity:

Check if Online/Offline

if (await NyConnectivity.isOnline()) {
  // Make API request
  final data = await api.fetchData();
} else {
  // Load from cache
  final data = await cache.getData();
}

// Or check if offline
if (await NyConnectivity.isOffline()) {
  showOfflineMessage();
}

Check Specific Connection Types

if (await NyConnectivity.isWifi()) {
  // Download large files on WiFi
  await downloadLargeFile();
}

if (await NyConnectivity.isMobile()) {
  // Warn about data usage
  showDataWarning();
}

// Other methods:
await NyConnectivity.isEthernet();
await NyConnectivity.isVpn();
await NyConnectivity.isBluetooth();

Get Current Status

// Get all active connection types
List<ConnectivityResult> results = await NyConnectivity.status();

if (results.contains(ConnectivityResult.wifi)) {
  print('WiFi is active');
}

// Get human-readable string
String type = await NyConnectivity.connectionTypeString();
print('Connected via: $type'); // "WiFi", "Mobile", "None", etc.

Listen to Changes

StreamSubscription subscription = NyConnectivity.stream().listen((results) {
  if (results.contains(ConnectivityResult.none)) {
    showOfflineUI();
  } else {
    showOnlineUI();
  }
});

// Don't forget to cancel when done
@override
void dispose() {
  subscription.cancel();
  super.dispose();
}

Conditional Execution

// Execute only when online (returns null if offline)
final data = await NyConnectivity.whenOnline(() async {
  return await api.fetchData();
});

if (data == null) {
  showOfflineMessage();
}

// Execute different callbacks based on status
final result = await NyConnectivity.when(
  online: () async => await api.fetchData(),
  offline: () async => await cache.getData(),
);

Widget Extensions

Quickly add connectivity awareness to any widget:

Show Offline Alternative

// Show a different widget when offline
MyContent().connectiveOr(
  offline: Text('Content unavailable offline'),
)

Only Show When Online

// Hide completely when offline
SyncButton().onlyOnline()

Only Show When Offline

// Show only when offline
OfflineMessage().onlyOffline()

Parameters

Connective

Parameter Type Default Description
onWifi Widget? - Widget when on WiFi
onMobile Widget? - Widget when on mobile data
onEthernet Widget? - Widget when on Ethernet
onVpn Widget? - Widget when on VPN
onBluetooth Widget? - Widget when on Bluetooth
onOther Widget? - Widget for other connections
onNone Widget? - Widget when offline
child Widget? - Default widget
showLoadingOnInit bool false Show loading while checking
loadingWidget Widget? - Custom loading widget
onConnectivityChanged Function? - Callback on change

OfflineBanner

Parameter Type Default Description
message String 'No internet connection' Banner text
backgroundColor Color? Colors.red.shade700 Banner background
textColor Color? Colors.white Text color
icon IconData? Icons.wifi_off Banner icon
height double 40 Banner height
animate bool true Enable slide animation
animationDuration Duration 300ms Animation duration

NyConnectivityState Enum

Value Description
wifi Connected via WiFi
mobile Connected via mobile data
ethernet Connected via Ethernet
vpn Connected via VPN
bluetooth Connected via Bluetooth
other Other connection type
none No connection