169 похожих чатов

Всем привет. Нужен совет очень умного архитектора. С некоторых пор

для простых и незацепленных компонентов, которые в приложении гарантированно будут синглтонами, я стал использовать статику. Упрощает синтаксис, не нужно постоянно извлекать объект из DI или писать .instance. Вот пример такого компонента - детектирует состояние сети путем периодического пинга сервера. Вопрос - насколько приемлемо использовать статику, какие грабли могут быть? Слышал, что статика - это зло, но до сих пор не понял почему. Спасибо.

import 'dart:async';
import 'package:get/get.dart';

import '/config/app_settings.dart';
import '/core/state/app_auth_state.dart';
import '/data/remote/ping_remote_client.dart';

class NetworkStatusObserver {
static bool _isConnected = true;
static bool _exit = false;
static final _streamController = StreamController<bool>.broadcast();
static late final _pingRemoteClient;

static bool get isOffline => !_isConnected;
static Stream<bool> get stream => _streamController.stream;

NetworkStatusObserver._();

static Future<void> init() async {
_pingRemoteClient = PingRemoteClient();
await _detect();
() async {
while (!_exit) {
await Future.delayed((_isConnected) ? AppSettings.pingIntervalOnline : AppSettings.pingIntervalOffline);
await _detect();
}
}();
}

static Future<void> _detect() async {
bool connected;
try {
final start = DateTime.now();
await _pingRemoteClient.ping();
final diff = DateTime.now().difference(start);
print('ping delay: $diff');
connected = true;
if (AppSettings.detectSlowNetwork &&
DateTime.now().difference(start) > Get.find<AppAuthState>().maxPingDelay.value) {
connected = false;
}
} catch (_) {
print('ping failed');
connected = false;
}
if (connected != _isConnected) {
_isConnected = connected;
_streamController.add(_isConnected);
}
}

// Если сетевая ошибка пришла по действию пользователя раньше, чем по пингу
static void forceTurnOffline() {
_isConnected = false;
_streamController.add(_isConnected);
}

static void dispose() {
_exit = true;
_streamController.close();
}
}

9 ответов

18 просмотров

Будешь делать тесты - придется рефакторить.

Юджин Флаттер
объясни

Статику не замокаешь. Статика существует не в контексте объекта, а в контексте класса

Юджин Флаттер- Автор вопроса

Ну, принимается. Хотя у нас нет автотестов и не будет.

Юджин Флаттер
Ну, принимается. Хотя у нас нет автотестов и не бу...

Такие проекты или учебные, или потом будет попоболь и слезы.

Юджин Флаттер- Автор вопроса
Amir Niyazov
Такие проекты или учебные, или потом будет попобол...

Ты шутишь. У меня в проде одна социальная сеть и один корпоративный апп. Никаких автотестов, только интеграционные по экрану.

Юджин Флаттер- Автор вопроса
Amir Niyazov
Такие проекты или учебные, или потом будет попобол...

Для автотестов нужен двойной бюджет проекта и специальный тестировщик. Которых никогда не дают.

Юджин Флаттер- Автор вопроса

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта