- Add Linter rules for return types and final fields - Enhance exception_handler code - Add ShareUtil to unify modification point

- Add Linter rules for return types and final fields - Enhance exception_handler code - Add ShareUtil to unify modification point

OmarHatem committed Feb 8, 2023 at 20:16 UTC 8a45cb4dc7f2abe03c06cd6c2e48d0cc2ea88f58
7 files changed +44 -38
analysis_options.yaml
+2
@@ -18,6 +18,8 @@ analyzer:
18 linter:
19 rules:
20 - cancel_subscriptions
21 + - always_declare_return_types
22 + - prefer_final_fields
23
24
25 # analyzer:
lib/src/screens/dashboard/widgets/address_page.dart
+4 -9
@@ -1,10 +1,8 @@
1 import 'package:cake_wallet/src/screens/base_page.dart';
2 -import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
2 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
3 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
5 -import 'package:cake_wallet/src/widgets/primary_button.dart';
6 -import 'package:cake_wallet/store/settings_store.dart';
4 import 'package:cake_wallet/themes/theme_base.dart';
5 +import 'package:cake_wallet/utils/share_util.dart';
6 import 'package:cake_wallet/utils/show_pop_up.dart';
7 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
8 import 'package:flutter/material.dart';
@@ -15,7 +13,6 @@ import 'package:cake_wallet/generated/i18n.dart';
13 import 'package:flutter_mobx/flutter_mobx.dart';
14 import 'package:keyboard_actions/keyboard_actions.dart';
15 import 'package:mobx/mobx.dart';
18 -import 'package:share_plus/share_plus.dart';
16
17 class AddressPage extends BasePage {
18 AddressPage({
@@ -101,11 +98,9 @@ class AddressPage extends BasePage {
98 splashColor: Colors.transparent,
99 iconSize: 25,
100 onPressed: () {
104 - final box = context.findRenderObject() as RenderBox?;
105 -
106 - Share.share(
107 - addressListViewModel.address.address,
108 - sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
101 + ShareUtil.share(
102 + text: addressListViewModel.address.address,
103 + context: context,
104 );
105 },
106 icon: shareImage,
lib/src/screens/exchange_trade/exchange_trade_page.dart
+1 -1
@@ -305,7 +305,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
305 _effectsInstalled = true;
306 }
307
308 - transactionStatePopup() {
308 + void transactionStatePopup() {
309 showPopUp<void>(
310 context: context,
311 builder: (BuildContext popupContext) {
lib/src/screens/receive/receive_page.dart
+4 -8
@@ -1,13 +1,11 @@
1 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
2 import 'package:cake_wallet/src/widgets/section_divider.dart';
3 import 'package:cake_wallet/themes/theme_base.dart';
4 +import 'package:cake_wallet/utils/share_util.dart';
5 import 'package:cake_wallet/utils/show_pop_up.dart';
5 -import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
6 import 'package:cw_core/wallet_type.dart';
7 import 'package:flutter/material.dart';
8 -import 'package:flutter/cupertino.dart';
8 import 'package:flutter_mobx/flutter_mobx.dart';
10 -import 'package:share_plus/share_plus.dart';
9 import 'package:cake_wallet/routes.dart';
10 import 'package:cake_wallet/generated/i18n.dart';
11 import 'package:cake_wallet/di.dart';
@@ -102,11 +100,9 @@ class ReceivePage extends BasePage {
100 splashColor: Colors.transparent,
101 iconSize: 25,
102 onPressed: () {
105 - final box = context.findRenderObject() as RenderBox?;
106 -
107 - Share.share(
108 - addressListViewModel.address.address,
109 - sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
103 + ShareUtil.share(
104 + text: addressListViewModel.address.address,
105 + context: context,
106 );
107 },
108 icon: shareImage
lib/src/screens/seed/wallet_seed_page.dart
+4 -7
@@ -1,12 +1,11 @@
1 import 'package:cake_wallet/palette.dart';
2 import 'package:cake_wallet/themes/theme_base.dart';
3 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
4 +import 'package:cake_wallet/utils/share_util.dart';
5 import 'package:cake_wallet/utils/show_bar.dart';
6 import 'package:cake_wallet/utils/show_pop_up.dart';
6 -import 'package:flutter/cupertino.dart';
7 import 'package:flutter/material.dart';
8 import 'package:flutter/services.dart';
9 -import 'package:share_plus/share_plus.dart';
9 import 'package:flutter_mobx/flutter_mobx.dart';
10 import 'package:cake_wallet/generated/i18n.dart';
11 import 'package:cake_wallet/src/widgets/primary_button.dart';
@@ -160,11 +159,9 @@ class WalletSeedPage extends BasePage {
159 padding: EdgeInsets.only(right: 8.0),
160 child: PrimaryButton(
161 onPressed: () {
163 - final box = context.findRenderObject() as RenderBox?;
164 -
165 - Share.share(
166 - walletSeedViewModel.seed,
167 - sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
162 + ShareUtil.share(
163 + text: walletSeedViewModel.seed,
164 + context: context,
165 );
166 },
167 text: S.of(context).save,
lib/utils/exception_handler.dart
+16 -13
@@ -14,6 +14,7 @@ import 'package:shared_preferences/shared_preferences.dart';
14
15 class ExceptionHandler {
16 static bool _hasError = false;
17 + static const coolDownDurationInDays = 7;
18
19 static void _saveException(String? error, StackTrace? stackTrace) async {
20 final appDocDir = await getApplicationDocumentsDirectory();
@@ -77,12 +78,11 @@ class ExceptionHandler {
78
79 final lastPopupDate =
80 DateTime.tryParse(sharedPrefs.getString(PreferencesKey.lastPopupDate) ?? '') ??
80 - DateTime.parse("2001-01-01");
81 + DateTime.now().subtract(Duration(days: coolDownDurationInDays + 1));
82
83 final durationSinceLastReport = DateTime.now().difference(lastPopupDate).inDays;
84
84 - // cool-down duration to be 7 days between reports
85 - if (_hasError || durationSinceLastReport < 7) {
85 + if (_hasError || durationSinceLastReport < coolDownDurationInDays) {
86 return;
87 }
88 _hasError = true;
@@ -117,14 +117,17 @@ class ExceptionHandler {
117 }
118
119 /// Ignore User related errors or system errors
120 - static bool _ignoreError(String error) {
121 - return error.contains("errno = 103") || // SocketException: Software caused connection abort
122 - error.contains("errno = 9") || // SocketException: Bad file descriptor
123 - error.contains("errno = 32") || // SocketException: Write failed (OS Error: Broken pipe)
124 - error.contains("errno = 60") || // SocketException: Operation timed out
125 - error.contains("errno = 54") || // SocketException: Connection reset by peer
126 - error.contains("errno = 49") || // SocketException: Can't assign requested address
127 - error.contains("PERMISSION_NOT_GRANTED") ||
128 - error.contains("errno = 28"); // OS Error: No space left on device
129 - }
120 + static bool _ignoreError(String error) =>
121 + _ignoredErrors.any((element) => error.contains(element));
122 +
123 + static const List<String> _ignoredErrors = const [
124 + "errno = 103", // SocketException: Software caused connection abort
125 + "errno = 9", // SocketException: Bad file descriptor
126 + "errno = 32", // SocketException: Write failed (OS Error: Broken pipe)
127 + "errno = 60", // SocketException: Operation timed out
128 + "errno = 54", // SocketException: Connection reset by peer
129 + "errno = 49", // SocketException: Can't assign requested address
130 + "errno = 28", // OS Error: No space left on device
131 + "PERMISSION_NOT_GRANTED",
132 + ];
133 }
lib/utils/share_util.dart new
+13
@@ -0,0 +1,13 @@
1 +import 'package:flutter/material.dart';
2 +import 'package:share_plus/share_plus.dart';
3 +
4 +class ShareUtil {
5 + static void share({required String text, required BuildContext context}) {
6 + final box = context.findRenderObject() as RenderBox?;
7 +
8 + Share.share(
9 + text,
10 + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
11 + );
12 + }
13 +}
\ No newline at end of file