Fixes for API calls

This commit is contained in:
Aleksandr Borisenko 2021-03-15 10:31:38 +03:00
parent 493d965562
commit 59d5907b29
18 changed files with 444 additions and 207 deletions

67
.gitignore vendored
View File

@ -1,6 +1,5 @@
# Miscellaneous
*.class
*.lock
*.log
*.pyc
*.swp
@ -16,62 +15,32 @@
*.iws
.idea/
# Visual Studio Code related
.vscode/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
build/
!pubspec.lock
.flutter-plugins-dependencies
/build/
# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
# Web related
lib/generated_plugin_registrant.dart
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# Symbolication related
app.*.symbols
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
ios/fastlane/README.md
ios/fastlane/report.xml
ios/Runner.ipa
ios/Runner.app.dSYM.zip
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

17
android/.gitignore vendored
View File

@ -1,10 +1,11 @@
*.iml
*.class
.gradle
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties

View File

@ -46,16 +46,16 @@ android {
flavorDimensions "deploy"
productFlavors {
fdroid {
dimension "deploy"
signingConfig null
}
unsigned {
dimension "deploy"
signingConfig null
}
}
//productFlavors {
// fdroid {
// dimension "deploy"
// signingConfig null
// }
// unsigned {
// dimension "deploy"
// signingConfig null
// }
//}
android.applicationVariants.all { variant ->
if (variant.flavorName == "fdroid") {

View File

@ -26,29 +26,29 @@ class Client {
};
Future<dynamic> get(String url) {
return http
.get('${this.base}$url', headers: _headers)
.then(_handleResponse);
return http.get(Uri.parse('${this.base}$url'),
headers: _headers,
).then(_handleResponse);
}
Future<dynamic> delete(String url) {
return http
.delete('${this.base}$url', headers: _headers)
.then(_handleResponse);
return http.delete(Uri.parse('${this.base}$url'),
headers: _headers,
).then(_handleResponse);
}
Future<dynamic> post(String url, {dynamic body}) {
return http
.post('${this.base}$url',
headers: _headers, body: _encoder.convert(body))
.then(_handleResponse);
return http.post(Uri.parse('${this.base}$url'),
headers: _headers,
body: _encoder.convert(body),
).then(_handleResponse);
}
Future<dynamic> put(String url, {dynamic body}) {
return http
.put('${this.base}$url',
headers: _headers, body: _encoder.convert(body))
.then(_handleResponse);
return http.put(Uri.parse('${this.base}$url'),
headers: _headers,
body: _encoder.convert(body),
).then(_handleResponse);
}
dynamic _handleResponse(http.Response response) {

View File

@ -22,7 +22,13 @@ class ListAPIService extends APIService implements ListService {
@override
Future<TaskList> get(int listId) {
return client.get('/lists/$listId').then((map) => TaskList.fromJson(map));
return client.get('/lists/$listId').then((map) {
if (map.containsKey('id')) {
return client.get("/lists/$listId/tasks").then((tasks) => TaskList.fromJson(
map, tasksJson: tasks));
}
return TaskList.fromJson(map);
});
}
@override

View File

@ -84,7 +84,7 @@ class VikunjaGlobalState extends State<VikunjaGlobal> {
_currentUser = null;
});
}).catchError((err) {
Scaffold.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('An error occured while logging out!'),
));
});

View File

@ -3,22 +3,32 @@ import 'package:vikunja_app/global.dart';
import 'package:vikunja_app/pages/home.dart';
import 'package:vikunja_app/pages/user/login.dart';
import 'package:vikunja_app/theme/theme.dart';
import 'package:alice/alice.dart';
void main() => runApp(VikunjaGlobal(
child: new VikunjaApp(home: HomePage()),
login: new VikunjaApp(home: LoginPage())));
class VikunjaApp extends StatelessWidget {
class VikunjaApp extends StatefulWidget {
final Widget home;
const VikunjaApp({Key key, this.home}) : super(key: key);
VikunjaApp({Key key, this.home}) : super(key: key);
@override
_VikunjaAppState createState() => _VikunjaAppState();
}
class _VikunjaAppState extends State<VikunjaApp> {
Alice alice = Alice(showNotification: true);
@override
Widget build(BuildContext context) {
return new MaterialApp(
navigatorKey: alice.getNavigatorKey(),
title: 'Vikunja',
theme: buildVikunjaTheme(),
darkTheme: buildVikunjaDarkTheme(),
home: this.home,
home: this.widget.home,
);
}
}

View File

@ -9,23 +9,24 @@ class TaskList {
final DateTime created, updated;
final List<Task> tasks;
TaskList(
{@required this.id,
@required this.title,
this.description,
this.owner,
this.created,
this.updated,
this.tasks});
TaskList({
@required this.id,
@required this.title,
this.description,
this.owner,
this.created,
this.updated,
this.tasks,
});
TaskList.fromJson(Map<String, dynamic> json)
TaskList.fromJson(Map<String, dynamic> json, {tasksJson})
: id = json['id'],
owner = User.fromJson(json['owner']),
description = json['description'],
title = json['title'],
updated = DateTime.parse(json['updated']),
created = DateTime.parse(json['created']),
tasks = (json['tasks'] == null ? [] : json['tasks'] as List<dynamic>)
tasks = (tasksJson == null ? [] : tasksJson as List<dynamic>)
?.map((taskJson) => Task.fromJson(taskJson))
?.toList();

View File

@ -21,7 +21,7 @@ class Namespace {
id = json['id'],
created = DateTime.parse(json['created']),
updated = DateTime.parse(json['updated']),
owner = User.fromJson(json['owner']);
owner = json['owner'] == null ? null : User.fromJson(json['owner']);
toJSON() => {
"created": created?.toIso8601String(),

View File

@ -15,9 +15,7 @@ class User {
String avatarUrl(BuildContext context) {
return VikunjaGlobal.of(context).client.base +
"/" +
this.username +
"/avatar";
"/avatar/${this.username}";
}
}

View File

@ -1,28 +1,26 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:after_layout/after_layout.dart';
import 'package:flutter/material.dart';
import 'package:vikunja_app/components/AddDialog.dart';
import 'package:vikunja_app/components/ErrorDialog.dart';
import 'package:vikunja_app/global.dart';
import 'package:vikunja_app/models/namespace.dart';
import 'package:vikunja_app/pages/namespace/namespace.dart';
import 'package:vikunja_app/pages/namespace/namespace_edit.dart';
import 'package:vikunja_app/pages/placeholder.dart';
import 'package:vikunja_app/global.dart';
import 'package:vikunja_app/models/namespace.dart';
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => new HomePageState();
State<StatefulWidget> createState() => HomePageState();
}
class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
List<Namespace> _namespaces = [];
Namespace get _currentNamespace =>
_selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length
? _namespaces[_selectedDrawerIndex]
: null;
Namespace get _currentNamespace => _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length
? _namespaces[_selectedDrawerIndex]
: null;
int _selectedDrawerIndex = -1;
bool _loading = true;
bool _showUserDetails = false;
@ -34,23 +32,19 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
Widget _namespacesWidget() {
List<Widget> namespacesList = <Widget>[];
_namespaces
.asMap()
.forEach((i, namespace) => namespacesList.add(new ListTile(
leading: const Icon(Icons.folder),
title: new Text(namespace.title),
selected: i == _selectedDrawerIndex,
onTap: () => _onSelectItem(i),
)));
_namespaces.asMap().forEach((i, namespace) => namespacesList.add(ListTile(
leading: const Icon(Icons.folder),
title: Text(namespace.title),
selected: i == _selectedDrawerIndex,
onTap: () => _onSelectItem(i),
)));
return this._loading
? Center(child: CircularProgressIndicator())
: RefreshIndicator(
child: ListView(
padding: EdgeInsets.zero,
children: ListTile.divideTiles(
context: context, tiles: namespacesList)
.toList()),
children: ListTile.divideTiles(context: context, tiles: namespacesList).toList()),
onRefresh: _loadNamespaces,
);
}
@ -71,9 +65,9 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
Widget build(BuildContext context) {
var currentUser = VikunjaGlobal.of(context).currentUser;
return new Scaffold(
return Scaffold(
appBar: AppBar(
title: new Text(_currentNamespace?.title ?? 'Vikunja'),
title: Text(_currentNamespace?.title ?? 'Vikunja'),
actions: _currentNamespace == null
? null
: <Widget>[
@ -84,59 +78,62 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
MaterialPageRoute(
builder: (context) => NamespaceEditPage(
namespace: _currentNamespace,
))))
)
)
)
),
],
),
drawer: new Drawer(
child: new Column(children: <Widget>[
new UserAccountsDrawerHeader(
accountEmail:
currentUser?.email == null ? null : Text(currentUser.email),
accountName:
currentUser?.username == null ? null : Text(currentUser.username),
onDetailsPressed: () {
setState(() {
_showUserDetails = !_showUserDetails;
});
},
currentAccountPicture: currentUser == null
? null
: CircleAvatar(
backgroundImage: NetworkImage(currentUser.avatarUrl(context)),
),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/graphics/hypnotize.png"),
repeat: ImageRepeat.repeat,
colorFilter: ColorFilter.mode(
Theme.of(context).primaryColor, BlendMode.multiply)),
),
),
new Builder(
builder: (BuildContext context) => Expanded(
child: _showUserDetails
? _userDetailsWidget(context)
: _namespacesWidget())),
new Align(
alignment: FractionalOffset.bottomCenter,
child: Builder(
builder: (context) => ListTile(
leading: const Icon(Icons.add),
title: const Text('Add namespace...'),
onTap: () => _addNamespaceDialog(context),
drawer: Drawer(
child: Column(children: <Widget>[
UserAccountsDrawerHeader(
accountEmail: currentUser?.email == null ? null : Text(currentUser.email),
accountName: currentUser?.username == null ? null : Text(currentUser.username),
onDetailsPressed: () {
setState(() {
_showUserDetails = !_showUserDetails;
});
},
currentAccountPicture: currentUser == null
? null
: CircleAvatar(
backgroundImage: NetworkImage(currentUser.avatarUrl(context)),
),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/graphics/hypnotize.png"),
repeat: ImageRepeat.repeat,
colorFilter: ColorFilter.mode(Theme.of(context).primaryColor, BlendMode.multiply),
),
),
),
),
])),
Builder(
builder: (BuildContext context) =>
Expanded(
child: _showUserDetails ? _userDetailsWidget(context) : _namespacesWidget(),
)
),
Align(
alignment: FractionalOffset.bottomCenter,
child: Builder(
builder: (context) => ListTile(
leading: const Icon(Icons.add),
title: const Text('Add namespace...'),
onTap: () => _addNamespaceDialog(context),
),
),
),
]),
),
body: _getDrawerItemWidget(_selectedDrawerIndex),
);
}
_getDrawerItemWidget(int pos) {
if (pos == -1) {
return new PlaceholderPage();
return PlaceholderPage();
}
return new NamespacePage(namespace: _namespaces[pos]);
return NamespacePage(namespace: _namespaces[pos]);
}
_onSelectItem(int index) {
@ -149,22 +146,17 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
context: context,
builder: (_) => AddDialog(
onAdd: (name) => _addNamespace(name, context),
decoration: new InputDecoration(
labelText: 'Namespace', hintText: 'eg. Personal Namespace'),
decoration: InputDecoration(labelText: 'Namespace', hintText: 'eg. Personal Namespace'),
));
}
_addNamespace(String name, BuildContext context) {
VikunjaGlobal.of(context)
.namespaceService
.create(Namespace(id: null, title: name))
.then((_) {
VikunjaGlobal.of(context).namespaceService.create(Namespace(id: null, title: name)).then((_) {
_loadNamespaces();
Scaffold.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('The namespace was created successfully!'),
));
}).catchError((error) => showDialog(
context: context, builder: (context) => ErrorDialog(error: error)));
}).catchError((error) => showDialog(context: context, builder: (context) => ErrorDialog(error: error)));
}
Future<void> _loadNamespaces() {

View File

@ -24,8 +24,7 @@ class _ListPageState extends State<ListPage> {
@override
void initState() {
_list = TaskList(
id: widget.taskList.id, title: widget.taskList.title, tasks: []);
_list = TaskList(id: widget.taskList.id, title: widget.taskList.title, tasks: []);
super.initState();
}
@ -39,7 +38,7 @@ class _ListPageState extends State<ListPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: new Text(_list.title),
title: Text(_list.title),
actions: <Widget>[
IconButton(
icon: Icon(Icons.edit),
@ -48,7 +47,10 @@ class _ListPageState extends State<ListPage> {
MaterialPageRoute(
builder: (context) => ListEditPage(
list: _list,
))))
)
)
),
),
],
),
body: !this._loading
@ -56,9 +58,7 @@ class _ListPageState extends State<ListPage> {
child: _list.tasks.length > 0
? ListView(
padding: EdgeInsets.symmetric(vertical: 8.0),
children: ListTile.divideTiles(
context: context, tiles: _listTasks())
.toList(),
children: ListTile.divideTiles(context: context, tiles: _listTasks()).toList(),
)
: Center(child: Text('This list is empty.')),
onRefresh: _loadList,
@ -66,7 +66,8 @@ class _ListPageState extends State<ListPage> {
: Center(child: CircularProgressIndicator()),
floatingActionButton: Builder(
builder: (context) => FloatingActionButton(
onPressed: () => _addItemDialog(context), child: Icon(Icons.add)),
onPressed: () => _addItemDialog(context), child: Icon(Icons.add),
),
));
}
@ -88,10 +89,7 @@ class _ListPageState extends State<ListPage> {
}
Future<void> _loadList() {
return VikunjaGlobal.of(context)
.listService
.get(widget.taskList.id)
.then((list) {
return VikunjaGlobal.of(context).listService.get(widget.taskList.id).then((list) {
setState(() {
_loading = false;
_list = list;
@ -104,14 +102,14 @@ class _ListPageState extends State<ListPage> {
context: context,
builder: (_) => AddDialog(
onAdd: (name) => _addItem(name, context),
decoration: new InputDecoration(
labelText: 'Task Name', hintText: 'eg. Milk')));
decoration: InputDecoration(labelText: 'Task Name', hintText: 'eg. Milk'),
),
);
}
_addItem(String name, BuildContext context) {
var globalState = VikunjaGlobal.of(context);
var newTask = Task(
id: null, title: name, owner: globalState.currentUser, done: false);
var newTask = Task(id: null, title: name, owner: globalState.currentUser, done: false);
setState(() => _loadingTasks.add(newTask));
globalState.taskService.add(_list.id, newTask).then((task) {
setState(() {
@ -120,7 +118,7 @@ class _ListPageState extends State<ListPage> {
}).then((_) {
_loadList();
setState(() => _loadingTasks.remove(newTask));
Scaffold.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('The task was added successfully!'),
));
});

View File

@ -101,12 +101,12 @@ class _ListEditPageState extends State<ListEditPage> {
VikunjaGlobal.of(context).listService.update(updatedList).then((_) {
setState(() => _loading = false);
Scaffold.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('The list was updated successfully!'),
));
}).catchError((err) {
setState(() => _loading = false);
Scaffold.of(context).showSnackBar(
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Something went wrong: ' + err.toString()),
action: SnackBarAction(

View File

@ -56,11 +56,8 @@ class _NamespacePageState extends State<NamespacePage>
color: Colors.white, size: 36.0)),
),
onDismissed: (direction) {
_removeList(ls).then((_) => Scaffold.of(
context)
.showSnackBar(SnackBar(
content:
Text("${ls.title} removed"))));
_removeList(ls).then((_) => ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("${ls.title} removed"))));
},
))).toList(),
)
@ -120,7 +117,7 @@ class _NamespacePageState extends State<NamespacePage>
.then((_) {
setState(() {});
_loadLists();
Scaffold.of(context).showSnackBar(
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('The list was successfully created!'),
),

View File

@ -107,12 +107,12 @@ class _NamespaceEditPageState extends State<NamespaceEditPage> {
.update(updatedNamespace)
.then((_) {
setState(() => _loading = false);
Scaffold.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('The namespace was updated successfully!'),
));
}).catchError((err) {
setState(() => _loading = false);
Scaffold.of(context).showSnackBar(
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Something went wrong: ' + err.toString()),
action: SnackBarAction(

View File

@ -24,7 +24,7 @@ class _LoginPageState extends State<LoginPage> {
padding: const EdgeInsets.all(16.0),
child: Builder(
builder: (BuildContext context) => Form(
autovalidate: true,
autovalidateMode: AutovalidateMode.always,
key: _formKey,
child: Center(
child: Column(
@ -122,7 +122,7 @@ class _LoginPageState extends State<LoginPage> {
'Login failed! Please check your server url and credentials. ' +
ex.toString()),
actions: <Widget>[
FlatButton(
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('Close'))
],

View File

@ -7,7 +7,14 @@ packages:
name: after_layout
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.7"
version: "1.0.7+2"
alice:
dependency: "direct main"
description:
name: alice
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.12"
archive:
dependency: transitive
description:
@ -29,6 +36,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.0"
better_player:
dependency: transitive
description:
name: better_player
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.61"
boolean_selector:
dependency: transitive
description:
@ -50,6 +64,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
chopper:
dependency: transitive
description:
name: chopper
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.6"
clock:
dependency: transitive
description:
@ -78,6 +99,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.5"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.16.2"
cupertino_icons:
dependency: "direct main"
description:
@ -85,6 +113,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
dio:
dependency: transitive
description:
name: dio
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.10"
fake_async:
dependency: transitive
description:
@ -92,6 +127,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.0"
flutter:
dependency: "direct main"
description: flutter
@ -104,18 +153,51 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.1"
flutter_local_notifications:
dependency: transitive
description:
name: flutter_local_notifications
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.1+2"
flutter_local_notifications_platform_interface:
dependency: transitive
description:
name: flutter_local_notifications_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0+1"
flutter_secure_storage:
dependency: "direct main"
description:
name: flutter_secure_storage
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
version: "4.1.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_widget_from_html_core:
dependency: transitive
description:
name: flutter_widget_from_html_core
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.2+1"
html:
dependency: transitive
description:
name: html
url: "https://pub.dartlang.org"
source: hosted
version: "0.14.0+4"
http:
dependency: "direct main"
description:
@ -137,6 +219,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.19"
import_js_library:
dependency: transitive
description:
name: import_js_library
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.3"
logging:
dependency: transitive
description:
name: logging
url: "https://pub.dartlang.org"
source: hosted
version: "0.11.4"
matcher:
dependency: transitive
description:
@ -151,6 +254,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
mime:
dependency: transitive
description:
name: mime
url: "https://pub.dartlang.org"
source: hosted
version: "0.9.7"
open_file:
dependency: transitive
description:
name: open_file
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
package_info:
dependency: transitive
description:
name: package_info
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.3+4"
path:
dependency: transitive
description:
@ -158,6 +282,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.27"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.1+2"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.4+8"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.5"
pedantic:
dependency: transitive
description:
@ -165,6 +324,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.0"
permission_handler:
dependency: transitive
description:
name: permission_handler
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0+2"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
petitparser:
dependency: transitive
description:
@ -172,6 +345,48 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.1.0"
rxdart:
dependency: transitive
description:
name: rxdart
url: "https://pub.dartlang.org"
source: hosted
version: "0.25.0"
sensors:
dependency: transitive
description:
name: sensors
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.2+6"
share:
dependency: transitive
description:
name: share
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.5+4"
sky_engine:
dependency: transitive
description: flutter
@ -219,6 +434,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.19"
timezone:
dependency: transitive
description:
name: timezone
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.1"
typed_data:
dependency: transitive
description:
@ -233,6 +455,48 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
visibility_detector:
dependency: transitive
description:
name: visibility_detector
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.5"
wakelock:
dependency: transitive
description:
name: wakelock
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.1+1"
wakelock_platform_interface:
dependency: transitive
description:
name: wakelock_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0+1"
wakelock_web:
dependency: transitive
description:
name: wakelock_web
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0+3"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
xml:
dependency: transitive
description:
@ -248,5 +512,5 @@ packages:
source: hosted
version: "2.2.1"
sdks:
dart: ">=2.12.0-29.10.beta <3.0.0"
dart: ">=2.12.0 <3.0.0"
flutter: ">=1.26.0-17.6.pre"

View File

@ -10,9 +10,10 @@ dependencies:
flutter:
sdk: flutter
cupertino_icons: 1.0.2
flutter_secure_storage: 4.0.0
flutter_secure_storage: 4.1.0
http: 0.12.2
after_layout: 1.0.7
after_layout: 1.0.7+2
alice: ^0.1.12
dev_dependencies:
flutter_test: