data_channel 3.0.0 copy "data_channel: ^3.0.0" to clipboard
data_channel: ^3.0.0 copied to clipboard

data_channel (DC) is a simple dart utility for handling exceptions and data routing.

Introduction #

Data Channel for Dart and Flutter.

data_channel (DC) is a lightweight Dart utility designed to simplify exception handling and data routing in your applications. Rather than cluttering your code with try-catch blocks at every function call, data_channel provides a clean, composable way to handle both success and error cases.

Installation #

Visit https://pub.dev/packages/data_channel#-installing-tab- for the latest version of * data_channel*

Examples #

Basic Usage

Return either error or data from any method:

import 'package:data_channel/data_channel.dart';

Future<DC<Exception, LoginModel>> getSomeLoginData() async {
  try {
    return DC<Exception, LoginModel>.data(someData);
  } on Exception {
    return DC<Exception, LoginModel>.error(CacheException());
  }
}

Check for errors in the calling code:

void doSomething() async {
  final value = await getSomeLoginData();

  if (value.hasError) {
    // handle error case
  } else if (value.hasData) {
    // handle success case
  }
}

DC.forward

Eliminate redundant error checks when transforming data models. DC.forward automatically propagates errors while allowing you to transform successful data:

Future<DC<Exception, UserModel>> checkSomethingAndReturn() async {
  final loginData = await getSomeLoginData();

  return DC.forward(
    loginData,
    UserModel(id: loginData.data?.tokenId),
  );
}

DC.pick

Handle different scenarios with optional callbacks:

final appData = await getSomeLoginData();

appData.pick(
  onError: (error) {
    if (error is CacheException) {
      alerts.setException(context, error);
    }
  },
  onData: (data) {
    value1 = data;
  },
  onNoData: () {
    value1 = getDefaultValue();
  },
);

// Alternative: use onNoError for combined data/no-data handling
appData.pick(
  onError: (error) {
    if (error is CacheException) {
      alerts.setException(context, error);
    }
  },
  onNoError: (data) {
    if (data != null) {
      value1 = data;
      return;
    }
    value1 = getDefaultValue();
  },
);

DC.fold

Handle both cases exhaustively with a clean functional approach:


final message = result.fold(
  onError: (error) => 'Operation failed: $error',
  onData: (data) => 'Success: $data',
);

// Use in widget building
final widget = result.fold(
  onError: (error) => ErrorWidget(error),
  onData: (data) => SuccessView(data),
);

Transforming Results

Transform data or errors while preserving the result structure:

// Transform successful data
final theme = await

getTheme();

final colorName = theme.mapData((t) => t.colorName);

// Transform errors into user-friendly messages
final userFriendly = theme.mapError(
      (error) => UserFacingException(error.message),
);

// Chain transformations
final uppercaseColor = theme
    .mapData((t) => t.colorName)
    .mapData((name) => name.toUpperCase());

Example: HTTP API with DC

Return data or error from an API call without leaking try catch everywhere.

import 'dart:convert';
import 'package:data_channel/data_channel.dart';
import 'package:http/http.dart' as http;

Future<DC<Exception, StarwarsResponse>> getStarwarsCharacters() async {
  try {
    final response =
        await http.get(Uri.parse('https://starwars-api.com/characters'));

    if (response.body.isEmpty) {
      return DC.error(Exception('No data available'));
    }

    final data = StarwarsResponse.fromJson(
      json.decode(response.body) as Map<String, dynamic>,
    );

    return DC.data(data);
  } on Exception catch (e) {
    return DC.error(e);
  }
}

Example: Consuming the result #

void loadCharacters() async {
  final result = await getStarwarsCharacters();

  if (result.hasError) {
    // handle error
  } else if (result.hasData) {
    // use data
  }
}

Example: DC.forward with API data #

Forward errors automatically while mapping to a new model.

Future<DC<Exception, UserModel>> loadUser() async {
  final starWarsData = await getStarwarsCharacters();

  return DC.forward(
    starWarsData,
    UserModel(id: starWarsData.data?.id),
  );
}

Example: DC.pick for UI logic #

final appData = await getStarwarsCharacters();

appData.pick(
  onError: (error) {
    alerts.setException(context, error);
  },
  onData: (data) {
    value1 = data;
  },
  onNoData: () {
    value1 = getDefaultValue();
  },
);

// alternative
appData.pick(
  onError: (error) {
    alerts.setException(context, error);
  },
  onNoError: (data) {
    if (data != null) {
      value1 = data;
      return;
    }
    value1 = getDefaultValue();
  },
);

Buy me a coffee #

Help keep this package free and open for everyone.
PayPal: paypal.me/ganeshrvel

Contact #

Feel free to reach out at ganeshrvel@outlook.com

About #

Package: pub.dev/packages/data_channel #

Repository: github.com/ganeshrvel/pub-data-channel

License #

data_channel | Data Channel for Dart and Flutter
MIT License

Copyright © 2018-Present Ganesh Rathinavel

7
likes
0
points
185
downloads

Publisher

verified publisherganeshrvel.com

Weekly Downloads

data_channel (DC) is a simple dart utility for handling exceptions and data routing.

Repository (GitHub)
View/report issues

License

unknown (license)

More

Packages that depend on data_channel