3
0
Fork 0

Upgrade to flutter 2 (#26)

This commit is contained in:
Nathan Brown 2021-04-23 12:33:28 -05:00 committed by GitHub
parent 10d6b6bb9a
commit a5ca3f86af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 141 additions and 168 deletions

View File

@ -5,13 +5,7 @@
- [`android-studio`](https://developer.android.com/studio) - [`android-studio`](https://developer.android.com/studio)
- [Enable NDK](https://developer.android.com/studio/projects/install-ndk) Check local.properties for current NDK version - [Enable NDK](https://developer.android.com/studio/projects/install-ndk) Check local.properties for current NDK version
Downgrade flutter to a 1.x release (the following worked on an AUR install of `flutter`) Currently using flutter 2.0.5
```
cd $(dirname $(readlink $(which flutter)))
git checkout 1.22.6
flutter doctor
```
Copy env.sh.example to env.sh and update your PATH variable to expose both flutter and go bin directories Copy env.sh.example to env.sh and update your PATH variable to expose both flutter and go bin directories

View File

@ -97,7 +97,7 @@ SPEC CHECKSUMS:
DKPhotoGallery: e880aef16c108333240e1e7327896f2ea380f4f0 DKPhotoGallery: e880aef16c108333240e1e7327896f2ea380f4f0
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
MMWormhole: 0cd3fd35a9118b2e2d762b499f54eeaace0be791 MMWormhole: 0cd3fd35a9118b2e2d762b499f54eeaace0be791
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
@ -109,4 +109,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: e8d4fb1ed5b0713de2623a28dfae2585e15c0d00 PODFILE CHECKSUM: e8d4fb1ed5b0713de2623a28dfae2585e15c0d00
COCOAPODS: 1.10.0 COCOAPODS: 1.10.1

View File

@ -343,7 +343,6 @@
"${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework", "${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework",
"${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework", "${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework",
"${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework", "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework",
"${PODS_ROOT}/../Flutter/Flutter.framework",
"${BUILT_PRODUCTS_DIR}/MMWormhole/MMWormhole.framework", "${BUILT_PRODUCTS_DIR}/MMWormhole/MMWormhole.framework",
"${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework",
"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
@ -360,7 +359,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMWormhole.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMWormhole.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",

View File

@ -2,6 +2,6 @@
<Workspace <Workspace
version = "1.0"> version = "1.0">
<FileRef <FileRef
location = "group:Runner.xcodeproj"> location = "self:">
</FileRef> </FileRef>
</Workspace> </Workspace>

View File

@ -87,7 +87,7 @@ class _CIDRFieldState extends State<CIDRField> {
widget.onChanged(cidr); widget.onChanged(cidr);
}, },
maxLength: 2, maxLength: 2,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly], inputFormatters: [FilteringTextInputFormatter.digitsOnly],
textInputAction: widget.textInputAction ?? TextInputAction.done, textInputAction: widget.textInputAction ?? TextInputAction.done,
placeholder: 'bits', placeholder: 'bits',
)) ))

View File

@ -93,7 +93,7 @@ class _IPAndPortFieldState extends State<IPAndPortField> {
widget.onChanged(_ipAndPort); widget.onChanged(_ipAndPort);
}, },
maxLength: 5, maxLength: 5,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly], inputFormatters: [FilteringTextInputFormatter.digitsOnly],
textInputAction: TextInputAction.done, textInputAction: TextInputAction.done,
placeholder: 'port', placeholder: 'port',
)) ))

View File

@ -2,7 +2,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/components/SpecialTextField.dart'; import 'package:mobile_nebula/components/SpecialTextField.dart';
import '../services/utils.dart'; import '../services/utils.dart';
@ -51,7 +50,7 @@ class IPField extends StatelessWidget {
maxLengthEnforced: ipOnly ? true : false, maxLengthEnforced: ipOnly ? true : false,
inputFormatters: ipOnly inputFormatters: ipOnly
? [IPTextInputFormatter()] ? [IPTextInputFormatter()]
: [WhitelistingTextInputFormatter(RegExp(r'[^\s]+'))], : [FilteringTextInputFormatter.allow(RegExp(r'[^\s]+'))],
textInputAction: this.textInputAction, textInputAction: this.textInputAction,
placeholder: help, placeholder: help,
)); ));

View File

@ -96,7 +96,7 @@ class SimplePage extends StatelessWidget {
title: Text(title), title: Text(title),
leading: leadingAction != null ? leadingAction : Utils.leadingBackWidget(context), leading: leadingAction != null ? leadingAction : Utils.leadingBackWidget(context),
trailingActions: trailingActions, trailingActions: trailingActions,
ios: (_) => CupertinoNavigationBarData( cupertino: (_, __) => CupertinoNavigationBarData(
transitionBetweenRoutes: false, transitionBetweenRoutes: false,
), ),
), ),

View File

@ -12,6 +12,7 @@ import 'package:flutter/widgets.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
//TODO: please let us delete this file
/// An eyeballed value that moves the cursor slightly left of where it is /// An eyeballed value that moves the cursor slightly left of where it is
/// rendered for text on Android so its positioning more accurately matches the /// rendered for text on Android so its positioning more accurately matches the

View File

@ -3,6 +3,8 @@ import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
//TODO: please let us delete this file
/// A normal TextField or CupertinoTextField that watches for copy, paste, cut, or select all keyboard actions /// A normal TextField or CupertinoTextField that watches for copy, paste, cut, or select all keyboard actions
class SpecialTextField extends StatefulWidget { class SpecialTextField extends StatefulWidget {
const SpecialTextField( const SpecialTextField(
@ -74,7 +76,7 @@ class _SpecialTextFieldState extends State<SpecialTextField> {
void initState() { void initState() {
formatters = widget.inputFormatters; formatters = widget.inputFormatters;
if (formatters == null || formatters.length == 0) { if (formatters == null || formatters.length == 0) {
formatters = [WhitelistingTextInputFormatter(RegExp(r'[^\t]'))]; formatters = [FilteringTextInputFormatter.allow(RegExp(r'[^\t]'))];
} }
super.initState(); super.initState();
@ -108,7 +110,7 @@ class _SpecialTextFieldState extends State<SpecialTextField> {
}, },
expands: widget.expands, expands: widget.expands,
inputFormatters: formatters, inputFormatters: formatters,
android: (_) => MaterialTextFieldData( material: (_, __) => MaterialTextFieldData(
decoration: InputDecoration( decoration: InputDecoration(
border: InputBorder.none, border: InputBorder.none,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
@ -116,7 +118,7 @@ class _SpecialTextFieldState extends State<SpecialTextField> {
hintText: widget.placeholder, hintText: widget.placeholder,
counterText: '', counterText: '',
suffix: widget.suffix)), suffix: widget.suffix)),
ios: (_) => CupertinoTextFieldData( cupertino: (_, __) => CupertinoTextFieldData(
decoration: BoxDecoration(), decoration: BoxDecoration(),
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
placeholder: widget.placeholder, placeholder: widget.placeholder,

View File

@ -1,6 +1,5 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/components/SpecialButton.dart'; import 'package:mobile_nebula/components/SpecialButton.dart';
import 'package:mobile_nebula/services/utils.dart'; import 'package:mobile_nebula/services/utils.dart';
@ -21,21 +20,5 @@ class ConfigButtonItem extends StatelessWidget {
constraints: BoxConstraints(minHeight: Utils.minInteractiveSize, minWidth: double.infinity), constraints: BoxConstraints(minHeight: Utils.minInteractiveSize, minWidth: double.infinity),
child: Center(child: content), child: Center(child: content),
)); ));
return Container(
color: Utils.configItemBackground(context),
constraints: BoxConstraints(minHeight: Utils.minInteractiveSize, minWidth: double.infinity),
child: PlatformButton(
androidFlat: (_) => MaterialFlatButtonData(
textTheme: ButtonTextTheme.normal, padding: EdgeInsets.zero, shape: RoundedRectangleBorder()),
ios: (_) => CupertinoButtonData(padding: EdgeInsets.zero, borderRadius: BorderRadius.zero),
padding: EdgeInsets.symmetric(vertical: 7),
child: content,
onPressed: () {
if (onPressed != null) {
onPressed();
}
},
));
} }
} }

View File

@ -85,12 +85,12 @@ class _AppState extends State<App> {
DefaultCupertinoLocalizations.delegate, DefaultCupertinoLocalizations.delegate,
], ],
title: 'Nebula', title: 'Nebula',
android: (_) { material: (_, __) {
return new MaterialAppData( return new MaterialAppData(
themeMode: brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark, themeMode: brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark,
); );
}, },
ios: (_) => CupertinoAppData( cupertino: (_, __) => CupertinoAppData(
theme: CupertinoThemeData(brightness: brightness), theme: CupertinoThemeData(brightness: brightness),
), ),
home: MainScreen(), home: MainScreen(),

View File

@ -10,7 +10,7 @@ class StaticHost {
lighthouse = json['lighthouse']; lighthouse = json['lighthouse'];
var list = json['destinations'] as List<dynamic>; var list = json['destinations'] as List<dynamic>;
var result = List<IPAndPort>(); var result = <IPAndPort>[];
list.forEach((item) { list.forEach((item) {
result.add(IPAndPort.fromString(item)); result.add(IPAndPort.fromString(item));

View File

@ -1,5 +1,3 @@
import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -40,7 +38,7 @@ class _AboutScreenState extends State<AboutScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (!ready) { if (!ready) {
return Center( return Center(
child: PlatformCircularProgressIndicator(ios: (_) { child: PlatformCircularProgressIndicator(cupertino: (_, __) {
return CupertinoProgressIndicatorData(radius: 50); return CupertinoProgressIndicatorData(radius: 50);
}), }),
); );

View File

@ -72,7 +72,7 @@ class _MainScreenState extends State<MainScreen> {
Widget _buildBody() { Widget _buildBody() {
if (!ready) { if (!ready) {
return Center( return Center(
child: PlatformCircularProgressIndicator(ios: (_) { child: PlatformCircularProgressIndicator(cupertino: (_, __) {
return CupertinoProgressIndicatorData(radius: 50); return CupertinoProgressIndicatorData(radius: 50);
}), }),
); );

View File

@ -77,7 +77,7 @@ class _AdvancedScreenState extends State<AdvancedScreen> {
suffix: Text("seconds"), suffix: Text("seconds"),
textAlign: TextAlign.right, textAlign: TextAlign.right,
maxLength: 5, maxLength: 5,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly], inputFormatters: [FilteringTextInputFormatter.digitsOnly],
onSaved: (val) { onSaved: (val) {
setState(() { setState(() {
settings.lhDuration = int.parse(val); settings.lhDuration = int.parse(val);
@ -93,7 +93,7 @@ class _AdvancedScreenState extends State<AdvancedScreen> {
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
textAlign: TextAlign.right, textAlign: TextAlign.right,
maxLength: 5, maxLength: 5,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly], inputFormatters: [FilteringTextInputFormatter.digitsOnly],
onSaved: (val) { onSaved: (val) {
setState(() { setState(() {
settings.port = int.parse(val); settings.port = int.parse(val);
@ -108,7 +108,7 @@ class _AdvancedScreenState extends State<AdvancedScreen> {
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
textAlign: TextAlign.right, textAlign: TextAlign.right,
maxLength: 5, maxLength: 5,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly], inputFormatters: [FilteringTextInputFormatter.digitsOnly],
onSaved: (val) { onSaved: (val) {
setState(() { setState(() {
settings.mtu = int.parse(val); settings.mtu = int.parse(val);

View File

@ -1,7 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:barcode_scan/barcode_scan.dart'; import 'package:barcode_scan/barcode_scan.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -189,25 +188,23 @@ class _CAListScreenState extends State<CAListScreen> {
ConfigButtonItem( ConfigButtonItem(
content: Text('Choose a file'), content: Text('Choose a file'),
onPressed: () async { onPressed: () async {
final file = await FilePicker.getFile();
if (file == null) {
return;
}
var content = "";
try { try {
content = file.readAsStringSync(); final content = await Utils.pickFile(context);
if (content == null) {
return;
}
_addCAEntry(content, (err) {
if (err != null) {
Utils.popError(context, 'Error loading CA file', err);
} else {
setState(() {});
}
});
} catch (err) { } catch (err) {
return Utils.popError(context, 'Failed to load CA file', err.toString()); return Utils.popError(context, 'Failed to load CA file', err.toString());
} }
_addCAEntry(content, (err) {
if (err != null) {
Utils.popError(context, 'Error loading CA file', err);
} else {
setState(() {});
}
});
}) })
], ],
) )

View File

@ -219,34 +219,22 @@ class _CertificateScreenState extends State<CertificateScreen> {
ConfigButtonItem( ConfigButtonItem(
content: Center(child: Text('Choose a file')), content: Center(child: Text('Choose a file')),
onPressed: () async { onPressed: () async {
var file;
try { try {
await FilePicker.clearTemporaryFiles(); final content = await Utils.pickFile(context);
file = await FilePicker.getFile(); if (content == null) {
if (file == null) {
print('GOT A NULL');
return; return;
} }
} catch (err) {
print('HEY $err');
}
var content = ""; _addCertEntry(content, (err) {
try { if (err != null) {
content = file.readAsStringSync(); Utils.popError(context, 'Error loading certificate file', err);
} else {
setState(() {});
}
});
} catch (err) { } catch (err) {
print('CAUGH IN READ ${file}'); return Utils.popError(context, 'Failed to load certificate file', err.toString());
return Utils.popError(context, 'Failed to load CA file', err.toString());
} }
_addCertEntry(content, (err) {
if (err != null) {
Utils.popError(context, 'Error loading certificate file', err);
} else {
setState(() {});
}
});
}) })
], ],
) )

View File

@ -1,11 +1,9 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/components/FormPage.dart'; import 'package:mobile_nebula/components/FormPage.dart';
import 'package:mobile_nebula/components/config/ConfigCheckboxItem.dart'; import 'package:mobile_nebula/components/config/ConfigCheckboxItem.dart';
import 'package:mobile_nebula/components/config/ConfigSection.dart'; import 'package:mobile_nebula/components/config/ConfigSection.dart';
import 'package:mobile_nebula/services/utils.dart';
class CipherScreen extends StatefulWidget { class CipherScreen extends StatefulWidget {
const CipherScreen({Key key, this.cipher, @required this.onSave}) : super(key: key); const CipherScreen({Key key, this.cipher, @required this.onSave}) : super(key: key);

View File

@ -1,11 +1,9 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/components/FormPage.dart'; import 'package:mobile_nebula/components/FormPage.dart';
import 'package:mobile_nebula/components/config/ConfigCheckboxItem.dart'; import 'package:mobile_nebula/components/config/ConfigCheckboxItem.dart';
import 'package:mobile_nebula/components/config/ConfigSection.dart'; import 'package:mobile_nebula/components/config/ConfigSection.dart';
import 'package:mobile_nebula/services/utils.dart';
class LogVerbosityScreen extends StatefulWidget { class LogVerbosityScreen extends StatefulWidget {
const LogVerbosityScreen({Key key, this.verbosity, @required this.onSave}) : super(key: key); const LogVerbosityScreen({Key key, this.verbosity, @required this.onSave}) : super(key: key);

View File

@ -20,7 +20,7 @@ class _Hostmap {
bool lighthouse; bool lighthouse;
_Hostmap({this.focusNode, this.nebulaIp, destinations, this.lighthouse}) _Hostmap({this.focusNode, this.nebulaIp, destinations, this.lighthouse})
: destinations = destinations ?? List<IPAndPort>(); : destinations = destinations ?? <IPAndPort>[];
} }
class StaticHostsScreen extends StatefulWidget { class StaticHostsScreen extends StatefulWidget {

View File

@ -6,13 +6,11 @@ import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/components/CIDRFormField.dart'; import 'package:mobile_nebula/components/CIDRFormField.dart';
import 'package:mobile_nebula/components/FormPage.dart'; import 'package:mobile_nebula/components/FormPage.dart';
import 'package:mobile_nebula/components/IPFormField.dart'; import 'package:mobile_nebula/components/IPFormField.dart';
import 'package:mobile_nebula/components/PlatformTextFormField.dart';
import 'package:mobile_nebula/components/config/ConfigItem.dart'; import 'package:mobile_nebula/components/config/ConfigItem.dart';
import 'package:mobile_nebula/components/config/ConfigSection.dart'; import 'package:mobile_nebula/components/config/ConfigSection.dart';
import 'package:mobile_nebula/models/CIDR.dart'; import 'package:mobile_nebula/models/CIDR.dart';
import 'package:mobile_nebula/models/UnsafeRoute.dart'; import 'package:mobile_nebula/models/UnsafeRoute.dart';
import 'package:mobile_nebula/services/utils.dart'; import 'package:mobile_nebula/services/utils.dart';
import 'package:mobile_nebula/validators/mtuValidator.dart';
class UnsafeRouteScreen extends StatefulWidget { class UnsafeRouteScreen extends StatefulWidget {
const UnsafeRouteScreen({Key key, this.route, this.onDelete, @required this.onSave}) : super(key: key); const UnsafeRouteScreen({Key key, this.route, this.onDelete, @required this.onSave}) : super(key: key);

View File

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'dart:ui'; import 'dart:ui';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/painting.dart'; import 'package:flutter/painting.dart';
@ -127,7 +128,7 @@ class Utils {
builder: (context) { builder: (context) {
if (Platform.isAndroid) { if (Platform.isAndroid) {
return AlertDialog(title: Text(title), content: Text(error), actions: <Widget>[ return AlertDialog(title: Text(title), content: Text(error), actions: <Widget>[
FlatButton( TextButton(
child: Text('Ok'), child: Text('Ok'),
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -163,4 +164,15 @@ class Utils {
final parts = ip.split('.'); final parts = ip.split('.');
return int.parse(parts[3]) | int.parse(parts[2]) << 8 | int.parse(parts[1]) << 16 | int.parse(parts[0]) << 24; return int.parse(parts[3]) | int.parse(parts[2]) << 8 | int.parse(parts[1]) << 16 | int.parse(parts[0]) << 24;
} }
static Future<String> pickFile(BuildContext context) async {
await FilePicker.platform.clearTemporaryFiles();
final result = await FilePicker.platform.pickFiles(allowMultiple: false);
if (result == null) {
return null;
}
final file = File(result.files.first.path);
return file.readAsString();
}
} }

View File

@ -7,7 +7,7 @@ packages:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.5.0-nullsafety.1" version: "2.5.0"
barcode_scan: barcode_scan:
dependency: "direct main" dependency: "direct main"
description: description:
@ -21,77 +21,77 @@ packages:
name: boolean_selector name: boolean_selector
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0-nullsafety.1" version: "2.1.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0-nullsafety.3" version: "1.1.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
name: charcode name: charcode
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-nullsafety.1" version: "1.2.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0-nullsafety.1" version: "1.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0-nullsafety.3" version: "1.15.0"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.4" version: "3.0.1"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "1.0.2"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-nullsafety.1" version: "1.2.0"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
file: file:
dependency: transitive dependency: transitive
description: description:
name: file name: file
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.0" version: "6.1.0"
file_picker: file_picker:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0" version: "3.0.1"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -110,14 +110,14 @@ packages:
name: flutter_platform_widgets name: flutter_platform_widgets
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.60.2" version: "1.2.0"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.8" version: "2.0.1"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -128,118 +128,111 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
intl: js:
dependency: transitive dependency: transitive
description: description:
name: intl name: js
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.16.1" version: "0.6.3"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10-nullsafety.1" version: "0.12.10"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0-nullsafety.3" version: "1.3.0"
package_info: package_info:
dependency: "direct main" dependency: "direct main"
description: description:
name: package_info name: package_info
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.1" version: "2.0.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0-nullsafety.1" version: "1.8.0"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.10" version: "2.0.1"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+1" version: "2.0.0"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
name: path_provider_macos name: path_provider_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4+3" version: "2.0.0"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "2.0.1"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
platform: platform:
dependency: transitive dependency: transitive
description: description:
name: platform name: platform
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1" version: "3.0.0"
platform_detect:
dependency: transitive
description:
name: platform_detect
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.0"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "2.0.0"
process: process:
dependency: transitive dependency: transitive
description: description:
name: process name: process
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.13" version: "4.2.1"
protobuf: protobuf:
dependency: transitive dependency: transitive
description: description:
name: protobuf name: protobuf
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.1.3"
pub_semver:
dependency: transitive
description:
name: pub_semver
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.4"
pull_to_refresh: pull_to_refresh:
dependency: "direct main" dependency: "direct main"
description: description:
name: pull_to_refresh name: pull_to_refresh
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.0" version: "1.6.5"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -251,105 +244,119 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0-nullsafety.2" version: "1.8.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0-nullsafety.1" version: "1.10.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0-nullsafety.1" version: "2.1.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0-nullsafety.1" version: "1.1.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-nullsafety.1" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.19-nullsafety.2" version: "0.2.19"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0-nullsafety.3" version: "1.3.0"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.5.2" version: "6.0.3"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+1" version: "2.0.0"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+7" version: "2.0.0"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.8" version: "2.0.2"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3+1" version: "2.0.0"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
uuid: uuid:
dependency: "direct main" dependency: "direct main"
description: description:
name: uuid name: uuid
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "3.0.4"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0-nullsafety.3" version: "2.1.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.0" version: "0.2.0"
sdks: sdks:
dart: ">=2.10.0-110 <2.11.0" dart: ">=2.12.0 <3.0.0"
flutter: ">=1.17.5 <2.0.0" flutter: ">=2.0.0"

View File

@ -22,15 +22,15 @@ dependencies:
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2 cupertino_icons: ^1.0.2
flutter_platform_widgets: ^0.60.2 flutter_platform_widgets: ^1.2.0
path_provider: ^1.6.0 path_provider: ^2.0.1
file_picker: ^1.9.0 file_picker: ^3.0.1
barcode_scan: ^3.0.1 barcode_scan: ^3.0.1
uuid: ^2.0.4 uuid: ^3.0.4
package_info: '>=0.4.1 <2.0.0' package_info: ^2.0.0
url_launcher: ^5.5.2 url_launcher: ^6.0.3
pull_to_refresh: ^1.6.0 pull_to_refresh: ^1.6.5
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: