loadable state is now detecting device connection status on failure

This commit is contained in:
2024-04-23 22:40:18 +02:00
parent 450c26b187
commit 04e8ce9c0a
10 changed files with 296 additions and 63 deletions

View File

@ -0,0 +1,26 @@
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import '../../../../infrastructure/controller.dart';
import 'error_bar_state.dart';
class ErrorBarController extends Controller<ErrorBarState> {
late StreamSubscription<List<ConnectivityResult>> _updateStream;
ErrorBarController() : super(const ErrorBarState(connections: null)) {
emitState(List<ConnectivityResult> v) => emit(state.copyWith(connections: v));
Connectivity().checkConnectivity().then(emitState);
_updateStream = Connectivity().onConnectivityChanged.listen(emitState);
}
bool connectivityStatusKnown() => state.connections != null;
bool isConnected({bool? def}) => !(state.connections?.contains(ConnectivityResult.none) ?? def!);
@override
Future<void> close() {
_updateStream.cancel();
return super.close();
}
}

View File

@ -0,0 +1,11 @@
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'error_bar_state.freezed.dart';
@freezed
class ErrorBarState with _$ErrorBarState {
const factory ErrorBarState({
required List<ConnectivityResult>? connections,
}) = _ErrorBarState;
}

View File

@ -0,0 +1,146 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'error_bar_state.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$ErrorBarState {
List<ConnectivityResult>? get connections =>
throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$ErrorBarStateCopyWith<ErrorBarState> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $ErrorBarStateCopyWith<$Res> {
factory $ErrorBarStateCopyWith(
ErrorBarState value, $Res Function(ErrorBarState) then) =
_$ErrorBarStateCopyWithImpl<$Res, ErrorBarState>;
@useResult
$Res call({List<ConnectivityResult>? connections});
}
/// @nodoc
class _$ErrorBarStateCopyWithImpl<$Res, $Val extends ErrorBarState>
implements $ErrorBarStateCopyWith<$Res> {
_$ErrorBarStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? connections = freezed,
}) {
return _then(_value.copyWith(
connections: freezed == connections
? _value.connections
: connections // ignore: cast_nullable_to_non_nullable
as List<ConnectivityResult>?,
) as $Val);
}
}
/// @nodoc
abstract class _$$ErrorBarStateImplCopyWith<$Res>
implements $ErrorBarStateCopyWith<$Res> {
factory _$$ErrorBarStateImplCopyWith(
_$ErrorBarStateImpl value, $Res Function(_$ErrorBarStateImpl) then) =
__$$ErrorBarStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({List<ConnectivityResult>? connections});
}
/// @nodoc
class __$$ErrorBarStateImplCopyWithImpl<$Res>
extends _$ErrorBarStateCopyWithImpl<$Res, _$ErrorBarStateImpl>
implements _$$ErrorBarStateImplCopyWith<$Res> {
__$$ErrorBarStateImplCopyWithImpl(
_$ErrorBarStateImpl _value, $Res Function(_$ErrorBarStateImpl) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? connections = freezed,
}) {
return _then(_$ErrorBarStateImpl(
connections: freezed == connections
? _value._connections
: connections // ignore: cast_nullable_to_non_nullable
as List<ConnectivityResult>?,
));
}
}
/// @nodoc
class _$ErrorBarStateImpl implements _ErrorBarState {
const _$ErrorBarStateImpl(
{required final List<ConnectivityResult>? connections})
: _connections = connections;
final List<ConnectivityResult>? _connections;
@override
List<ConnectivityResult>? get connections {
final value = _connections;
if (value == null) return null;
if (_connections is EqualUnmodifiableListView) return _connections;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
String toString() {
return 'ErrorBarState(connections: $connections)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$ErrorBarStateImpl &&
const DeepCollectionEquality()
.equals(other._connections, _connections));
}
@override
int get hashCode => Object.hash(
runtimeType, const DeepCollectionEquality().hash(_connections));
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$ErrorBarStateImplCopyWith<_$ErrorBarStateImpl> get copyWith =>
__$$ErrorBarStateImplCopyWithImpl<_$ErrorBarStateImpl>(this, _$identity);
}
abstract class _ErrorBarState implements ErrorBarState {
const factory _ErrorBarState(
{required final List<ConnectivityResult>? connections}) =
_$ErrorBarStateImpl;
@override
List<ConnectivityResult>? get connections;
@override
@JsonKey(ignore: true)
_$$ErrorBarStateImplCopyWith<_$ErrorBarStateImpl> get copyWith =>
throw _privateConstructorUsedError;
}