forked from core/mobile_nebula
Upgrade to flutter 2 (#26)
This commit is contained in:
parent
10d6b6bb9a
commit
a5ca3f86af
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
<Workspace
|
<Workspace
|
||||||
version = "1.0">
|
version = "1.0">
|
||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "self:">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
|
|
@ -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',
|
||||||
))
|
))
|
||||||
|
|
|
@ -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',
|
||||||
))
|
))
|
||||||
|
|
|
@ -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,
|
||||||
));
|
));
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
|
@ -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);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,16 +188,10 @@ 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);
|
||||||
} catch (err) {
|
if (content == null) {
|
||||||
return Utils.popError(context, 'Failed to load CA file', err.toString());
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_addCAEntry(content, (err) {
|
_addCAEntry(content, (err) {
|
||||||
|
@ -208,6 +201,10 @@ class _CAListScreenState extends State<CAListScreen> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
return Utils.popError(context, 'Failed to load CA file', err.toString());
|
||||||
|
}
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -219,26 +219,11 @@ 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 = "";
|
|
||||||
try {
|
|
||||||
content = file.readAsStringSync();
|
|
||||||
} catch (err) {
|
|
||||||
print('CAUGH IN READ ${file}');
|
|
||||||
return Utils.popError(context, 'Failed to load CA file', err.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
_addCertEntry(content, (err) {
|
_addCertEntry(content, (err) {
|
||||||
if (err != null) {
|
if (err != null) {
|
||||||
|
@ -247,6 +232,9 @@ class _CertificateScreenState extends State<CertificateScreen> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (err) {
|
||||||
|
return Utils.popError(context, 'Failed to load certificate file', err.toString());
|
||||||
|
}
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
141
pubspec.lock
141
pubspec.lock
|
@ -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"
|
||||||
|
|
16
pubspec.yaml
16
pubspec.yaml
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue