add a video page and disply tiles correctly
This commit is contained in:
		| @@ -10,7 +10,6 @@ class API { | |||||||
|       String apinode, String action, Object payload) async { |       String apinode, String action, Object payload) async { | ||||||
|     final Completer<String> cmpl = Completer(); |     final Completer<String> cmpl = Completer(); | ||||||
|     final t = await Token.getInstance().getToken(); |     final t = await Token.getInstance().getToken(); | ||||||
|     Log.d(t); |  | ||||||
|     if (t != null) { |     if (t != null) { | ||||||
|       final resp = await http.post( |       final resp = await http.post( | ||||||
|         Uri.parse(t.domain + '/api/$apinode/$action'), |         Uri.parse(t.domain + '/api/$apinode/$action'), | ||||||
|   | |||||||
| @@ -31,8 +31,11 @@ class Token { | |||||||
|       WidgetsFlutterBinding.ensureInitialized(); |       WidgetsFlutterBinding.ensureInitialized(); | ||||||
|       final token = await _storage.read(key: 'jwt'); |       final token = await _storage.read(key: 'jwt'); | ||||||
|       final domain = await _storage.read(key: 'domain'); |       final domain = await _storage.read(key: 'domain'); | ||||||
|  |  | ||||||
|       // check if value is defined in phone store |       // check if value is defined in phone store | ||||||
|       if (token != null && domain != null) { |       if (token != null && domain != null) { | ||||||
|  |         _tokenval = token; | ||||||
|  |         _domain = domain; | ||||||
|         completer.complete(TokenT(token, domain)); |         completer.complete(TokenT(token, domain)); | ||||||
|       } else { |       } else { | ||||||
|         Log.d("no token defined"); |         Log.d("no token defined"); | ||||||
|   | |||||||
| @@ -60,8 +60,7 @@ class _LoginScreenState extends State<LoginScreen> { | |||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return Container( |     return Container( | ||||||
|       decoration: const BoxDecoration( |       decoration: const BoxDecoration( | ||||||
|         image: DecorationImage( |         image: DecorationImage(image: AssetImage('assets/images/login.png'), fit: BoxFit.cover), | ||||||
|             image: AssetImage('assets/images/login.png'), fit: BoxFit.cover), |  | ||||||
|       ), |       ), | ||||||
|       child: Scaffold( |       child: Scaffold( | ||||||
|         backgroundColor: Colors.transparent, |         backgroundColor: Colors.transparent, | ||||||
| @@ -76,8 +75,7 @@ class _LoginScreenState extends State<LoginScreen> { | |||||||
|             ), |             ), | ||||||
|             SingleChildScrollView( |             SingleChildScrollView( | ||||||
|               child: Container( |               child: Container( | ||||||
|                 padding: EdgeInsets.only( |                 padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.5), | ||||||
|                     top: MediaQuery.of(context).size.height * 0.5), |  | ||||||
|                 child: Column( |                 child: Column( | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                   children: [ |                   children: [ | ||||||
| @@ -88,6 +86,7 @@ class _LoginScreenState extends State<LoginScreen> { | |||||||
|                           TextField( |                           TextField( | ||||||
|                             controller: _domainTextController, |                             controller: _domainTextController, | ||||||
|                             style: const TextStyle(color: Colors.black), |                             style: const TextStyle(color: Colors.black), | ||||||
|  |                             autofocus: true, | ||||||
|                             decoration: InputDecoration( |                             decoration: InputDecoration( | ||||||
|                                 fillColor: Colors.grey.shade100, |                                 fillColor: Colors.grey.shade100, | ||||||
|                                 filled: true, |                                 filled: true, | ||||||
| @@ -103,6 +102,7 @@ class _LoginScreenState extends State<LoginScreen> { | |||||||
|                             controller: _passwordTextController, |                             controller: _passwordTextController, | ||||||
|                             style: const TextStyle(), |                             style: const TextStyle(), | ||||||
|                             obscureText: true, |                             obscureText: true, | ||||||
|  |                             autofocus: true, | ||||||
|                             decoration: InputDecoration( |                             decoration: InputDecoration( | ||||||
|                                 fillColor: Colors.grey.shade100, |                                 fillColor: Colors.grey.shade100, | ||||||
|                                 filled: true, |                                 filled: true, | ||||||
| @@ -119,8 +119,7 @@ class _LoginScreenState extends State<LoginScreen> { | |||||||
|                             children: [ |                             children: [ | ||||||
|                               const Text( |                               const Text( | ||||||
|                                 'Sign in', |                                 'Sign in', | ||||||
|                                 style: TextStyle( |                                 style: TextStyle(fontSize: 27, fontWeight: FontWeight.w700), | ||||||
|                                     fontSize: 27, fontWeight: FontWeight.w700), |  | ||||||
|                               ), |                               ), | ||||||
|                               CircleAvatar( |                               CircleAvatar( | ||||||
|                                 radius: 30, |                                 radius: 30, | ||||||
| @@ -128,10 +127,9 @@ class _LoginScreenState extends State<LoginScreen> { | |||||||
|                                 child: IconButton( |                                 child: IconButton( | ||||||
|                                     color: Colors.white, |                                     color: Colors.white, | ||||||
|                                     onPressed: () { |                                     onPressed: () { | ||||||
|                                       final pwd = |                                       Log.d("clickkked"); | ||||||
|                                           _passwordTextController.value.text; |                                       final pwd = _passwordTextController.value.text; | ||||||
|                                       final domain = |                                       final domain = _domainTextController.value.text; | ||||||
|                                           _domainTextController.value.text; |  | ||||||
|                                       login(pwd, domain).then((value) { |                                       login(pwd, domain).then((value) { | ||||||
|                                         if (value != "") { |                                         if (value != "") { | ||||||
|                                           setState(() { |                                           setState(() { | ||||||
|   | |||||||
| @@ -1,11 +1,36 @@ | |||||||
|  | import  "package:dart_vlc/dart_vlc.dart"; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter/services.dart'; | ||||||
| import 'package:openmediacentermobile/app.dart'; | import 'package:openmediacentermobile/app.dart'; | ||||||
|  |  | ||||||
| import 'log/log.dart'; | import 'log/log.dart'; | ||||||
| import 'login/logincontext.dart'; | import 'login/logincontext.dart'; | ||||||
|  | import 'platform.dart'; | ||||||
|  |  | ||||||
| // main app entry point | // main app entry point | ||||||
| void main() { | void main() async { | ||||||
|   Log.i("App init!"); |   Log.i("App init!"); | ||||||
|   runApp(const LoginContainer(child: App())); |   if (isDesktop()) { | ||||||
|  |     DartVLC.initialize(); | ||||||
|  |   } else { | ||||||
|  |     await loadDeviceInfo(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // RawKeyboard.instance.addListener((event) { | ||||||
|  |   //   if (LogicalKeyboardKey.arrowLeft == event.logicalKey) { | ||||||
|  |   //     FocusManager.instance.primaryFocus?.focusInDirection(TraversalDirection.left); | ||||||
|  |   //   } else if (LogicalKeyboardKey.arrowRight == event.logicalKey) { | ||||||
|  |   //     FocusManager.instance.primaryFocus?.focusInDirection(TraversalDirection.right); | ||||||
|  |   //   } else if (LogicalKeyboardKey.arrowDown == event.logicalKey) { | ||||||
|  |   //     FocusManager.instance.primaryFocus?.focusInDirection(TraversalDirection.down); | ||||||
|  |   //   } else if (LogicalKeyboardKey.arrowUp == event.logicalKey) { | ||||||
|  |   //     FocusManager.instance.primaryFocus?.focusInDirection(TraversalDirection.up); | ||||||
|  |   //   } | ||||||
|  |   // }); | ||||||
|  |  | ||||||
|  |   runApp(Shortcuts(shortcuts: <LogicalKeySet, Intent>{ | ||||||
|  |     LogicalKeySet(LogicalKeyboardKey.select): ActivateIntent(), | ||||||
|  |   }, child: const LoginContainer(child: App()))); | ||||||
|  |  | ||||||
|  |   // runApp(const LoginContainer(child: App())); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,8 +1,10 @@ | |||||||
| import 'dart:convert'; | import 'dart:convert'; | ||||||
|  |  | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:openmediacentermobile/videoscreen.dart'; | ||||||
|  |  | ||||||
| import 'api/api.dart'; | import 'api/api.dart'; | ||||||
|  | import 'platform.dart'; | ||||||
|  |  | ||||||
| class VideoT { | class VideoT { | ||||||
|   int id; |   int id; | ||||||
| @@ -12,8 +14,7 @@ class VideoT { | |||||||
|   VideoT(this.title, this.id, this.Ratio); |   VideoT(this.title, this.id, this.Ratio); | ||||||
|  |  | ||||||
|   factory VideoT.fromJson(dynamic json) { |   factory VideoT.fromJson(dynamic json) { | ||||||
|     return VideoT(json['MovieName'] as String, json['MovieId'] as int, |     return VideoT(json['MovieName'] as String, json['MovieId'] as int, (json['Ratio'] as num).toDouble()); | ||||||
|         (json['Ratio'] as num).toDouble()); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -26,31 +27,82 @@ class PreviewTile extends StatefulWidget { | |||||||
| } | } | ||||||
|  |  | ||||||
| class _PreviewTileState extends State<PreviewTile> { | class _PreviewTileState extends State<PreviewTile> { | ||||||
|   String prev = ""; |   late Future<Image> _preview; | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   void initState() { |   void initState() { | ||||||
|     super.initState(); |     super.initState(); | ||||||
|  |  | ||||||
|     API.query("video", "readThumbnail", {'Movieid': widget.dta.id}).then( |     _preview = loadData(); | ||||||
|         (value) { |   } | ||||||
|       setState(() { |  | ||||||
|         prev = value.substring(23); |   Future<Image> loadData() async { | ||||||
|       }); |     final data = await API.query("video", "readThumbnail", {'Movieid': widget.dta.id}); | ||||||
|     }); |  | ||||||
|  |     final img = Image.memory( | ||||||
|  |       base64Decode(data.substring(23)), | ||||||
|  |       width: double.infinity, | ||||||
|  |       fit: BoxFit.fitWidth, | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     // precache image to avoid loading time to render image | ||||||
|  |     await precacheImage(img.image, context); | ||||||
|  |  | ||||||
|  |     return img; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return InkWell( |     return FutureBuilder<Image>( | ||||||
|       child: Column( |       future: _preview, // a previously-obtained Future<String> or null | ||||||
|         children: [ |       builder: (BuildContext context, AsyncSnapshot<Image> snapshot) { | ||||||
|           Text(widget.dta.title), |         if (snapshot.hasError) { | ||||||
|           prev != "" |           return Text("Error"); | ||||||
|               ? Image.memory(base64Decode(prev)) |         } else if (snapshot.hasData) { | ||||||
|               : const CircularProgressIndicator() |           return ClipRRect( | ||||||
|         ], |             borderRadius: BorderRadius.circular(20.0), | ||||||
|       ), |             child: Stack( | ||||||
|  |               children: [ | ||||||
|  |                 Container( | ||||||
|  |                   child: Column( | ||||||
|  |                     children: [Text(widget.dta.title, style: TextStyle(fontSize: isTV() ? 8 : 12)), snapshot.data!], | ||||||
|  |                   ), | ||||||
|  |                   color: Colors.green, | ||||||
|  |                 ), | ||||||
|  |                 Positioned.fill( | ||||||
|  |                   child: Material( | ||||||
|  |                     color: Colors.transparent, | ||||||
|  |                     child: InkWell( | ||||||
|  |                       onTap: () { | ||||||
|  |                         Navigator.push( | ||||||
|  |                           context, | ||||||
|  |                           MaterialPageRoute( | ||||||
|  |                             builder: (context) => VideoScreen(videoID: widget.dta.id), | ||||||
|  |                           ), | ||||||
|  |                         ); | ||||||
|  |                       }, | ||||||
|  |                     ), | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |               ], | ||||||
|  |             ), | ||||||
|  |           ); | ||||||
|  |         } else { | ||||||
|  |           return Column(children: const <Widget>[ | ||||||
|  |             SizedBox(height: 100), | ||||||
|  |             SizedBox( | ||||||
|  |               width: 60, | ||||||
|  |               height: 60, | ||||||
|  |               child: CircularProgressIndicator(), | ||||||
|  |             ), | ||||||
|  |             Padding( | ||||||
|  |               padding: EdgeInsets.only(top: 16), | ||||||
|  |               child: Text('Awaiting result...'), | ||||||
|  |             ), | ||||||
|  |             SizedBox(height: 100), | ||||||
|  |           ]); | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,7 +4,9 @@ import 'package:flutter/material.dart'; | |||||||
| import 'package:openmediacentermobile/api/api.dart'; | import 'package:openmediacentermobile/api/api.dart'; | ||||||
|  |  | ||||||
| import 'log/log.dart'; | import 'log/log.dart'; | ||||||
|  | import 'platform.dart'; | ||||||
| import 'preview_tile.dart'; | import 'preview_tile.dart'; | ||||||
|  | import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; | ||||||
|  |  | ||||||
| class VideoFeed extends StatefulWidget { | class VideoFeed extends StatefulWidget { | ||||||
|   const VideoFeed({Key? key}) : super(key: key); |   const VideoFeed({Key? key}) : super(key: key); | ||||||
| @@ -16,36 +18,59 @@ class VideoFeed extends StatefulWidget { | |||||||
| } | } | ||||||
|  |  | ||||||
| class VideoFeedState extends State<VideoFeed> { | class VideoFeedState extends State<VideoFeed> { | ||||||
|   List<VideoT> _vids = []; |   late Future<List<VideoT>> _data; | ||||||
|  |  | ||||||
|  |   Future<List<VideoT>> loadData() async { | ||||||
|  |     final data = await API.query("video", "getMovies", {'Tag': 1, 'Sort': 0}); | ||||||
|  |  | ||||||
|  |     final d = jsonDecode(data); | ||||||
|  |  | ||||||
|  |     List<VideoT> dta = (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList(); | ||||||
|  |  | ||||||
|  |     return dta; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   void initState() { |   void initState() { | ||||||
|     super.initState(); |     super.initState(); | ||||||
|  |  | ||||||
|     API.query("video", "getMovies", {'Tag': 1, 'Sort': 0}).then((value) { |     _data = loadData(); | ||||||
|       final d = jsonDecode(value); |  | ||||||
|  |  | ||||||
|       List<VideoT> dta = |  | ||||||
|           (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList(); |  | ||||||
|  |  | ||||||
|       setState(() { |  | ||||||
|         _vids = dta; |  | ||||||
|       }); |  | ||||||
|     }); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return GridView.builder( |     double width = MediaQuery.of(context).size.width; | ||||||
|         gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( |     Log.d(width); | ||||||
|             crossAxisCount: 2, |  | ||||||
|             childAspectRatio: MediaQuery.of(context).size.width / |     return FutureBuilder<List<VideoT>>( | ||||||
|                 MediaQuery.of(context).size.height, |       future: _data, // a previously-obtained Future<String> or null | ||||||
|             crossAxisSpacing: 10), |       builder: (BuildContext context, AsyncSnapshot<List<VideoT>> snapshot) { | ||||||
|         itemCount: _vids.length, |         if (snapshot.hasError) { | ||||||
|         itemBuilder: (context, index) { |           return Text("Error"); | ||||||
|           Log.d("item $index built!"); |         } else if (snapshot.hasData) { | ||||||
|           return PreviewTile(dta: _vids[index]); |           return MasonryGridView.count( | ||||||
|         }); |             // every tile should be at max 330 pixels long... | ||||||
|  |             crossAxisCount: isTV() ? width ~/ 200 : width ~/ 330, | ||||||
|  |             mainAxisSpacing: 4, | ||||||
|  |             crossAxisSpacing: 4, | ||||||
|  |             itemBuilder: (context, index) { | ||||||
|  |               return PreviewTile(dta: snapshot.data![index]); | ||||||
|  |             }, | ||||||
|  |           ); | ||||||
|  |         } else { | ||||||
|  |           return Column(children: const <Widget>[ | ||||||
|  |             SizedBox( | ||||||
|  |               width: 60, | ||||||
|  |               height: 60, | ||||||
|  |               child: CircularProgressIndicator(), | ||||||
|  |             ), | ||||||
|  |             Padding( | ||||||
|  |               padding: EdgeInsets.only(top: 16), | ||||||
|  |               child: Text('Awaiting result...'), | ||||||
|  |             ) | ||||||
|  |           ]); | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										177
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -8,6 +8,13 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.8.2" |     version: "2.8.2" | ||||||
|  |   audio_video_progress_bar: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: audio_video_progress_bar | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "0.10.0" | ||||||
|   boolean_selector: |   boolean_selector: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -50,6 +57,62 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.0.4" |     version: "1.0.4" | ||||||
|  |   dart_vlc: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: dart_vlc | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "0.1.9" | ||||||
|  |   dart_vlc_ffi: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: dart_vlc_ffi | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "0.1.5+1" | ||||||
|  |   device_info_plus: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: device_info_plus | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "3.2.3" | ||||||
|  |   device_info_plus_linux: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: device_info_plus_linux | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.1.1" | ||||||
|  |   device_info_plus_macos: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: device_info_plus_macos | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.2.3" | ||||||
|  |   device_info_plus_platform_interface: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: device_info_plus_platform_interface | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.3.0+1" | ||||||
|  |   device_info_plus_web: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: device_info_plus_web | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.1.0" | ||||||
|  |   device_info_plus_windows: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: device_info_plus_windows | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.1.1" | ||||||
|   fake_async: |   fake_async: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -57,6 +120,20 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.2.0" |     version: "1.2.0" | ||||||
|  |   ffi: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: ffi | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "1.1.2" | ||||||
|  |   file: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: file | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "6.1.2" | ||||||
|   flutter: |   flutter: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -111,6 +188,13 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.1.2" |     version: "1.1.2" | ||||||
|  |   flutter_staggered_grid_view: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: flutter_staggered_grid_view | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "0.6.1" | ||||||
|   flutter_test: |   flutter_test: | ||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -141,7 +225,7 @@ packages: | |||||||
|       name: js |       name: js | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.6.3" |     version: "0.6.4" | ||||||
|   lints: |   lints: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -169,7 +253,7 @@ packages: | |||||||
|       name: material_color_utilities |       name: material_color_utilities | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.1.2" |     version: "0.1.4" | ||||||
|   meta: |   meta: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -183,7 +267,63 @@ packages: | |||||||
|       name: path |       name: path | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.8.0" |     version: "1.8.1" | ||||||
|  |   path_provider: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.9" | ||||||
|  |   path_provider_android: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider_android | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.12" | ||||||
|  |   path_provider_ios: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider_ios | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.8" | ||||||
|  |   path_provider_linux: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider_linux | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.1.5" | ||||||
|  |   path_provider_macos: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider_macos | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.5" | ||||||
|  |   path_provider_platform_interface: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider_platform_interface | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.1" | ||||||
|  |   path_provider_windows: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: path_provider_windows | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.5" | ||||||
|  |   platform: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: platform | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "3.1.0" | ||||||
|   plugin_platform_interface: |   plugin_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -191,6 +331,13 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.0.2" |     version: "2.0.2" | ||||||
|  |   process: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: process | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "4.2.4" | ||||||
|   sky_engine: |   sky_engine: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -202,7 +349,7 @@ packages: | |||||||
|       name: source_span |       name: source_span | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.8.1" |     version: "1.8.2" | ||||||
|   stack_trace: |   stack_trace: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -237,7 +384,7 @@ packages: | |||||||
|       name: test_api |       name: test_api | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.4.8" |     version: "0.4.9" | ||||||
|   typed_data: |   typed_data: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -251,7 +398,21 @@ packages: | |||||||
|       name: vector_math |       name: vector_math | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.1" |     version: "2.1.2" | ||||||
|  |   win32: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: win32 | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.5.1" | ||||||
|  |   xdg_directories: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: xdg_directories | ||||||
|  |       url: "https://pub.dartlang.org" | ||||||
|  |     source: hosted | ||||||
|  |     version: "0.2.0+1" | ||||||
| sdks: | sdks: | ||||||
|   dart: ">=2.15.0 <3.0.0" |   dart: ">=2.16.0-100.0.dev <3.0.0" | ||||||
|   flutter: ">=2.0.0" |   flutter: ">=2.8.0" | ||||||
|   | |||||||
| @@ -37,6 +37,9 @@ dependencies: | |||||||
|   flutter_secure_storage: ^5.0.2 |   flutter_secure_storage: ^5.0.2 | ||||||
|   logger: ^1.1.0 |   logger: ^1.1.0 | ||||||
|   http: ^0.13.4 |   http: ^0.13.4 | ||||||
|  |   flutter_staggered_grid_view: ^0.6.1 | ||||||
|  |   dart_vlc: ^0.1.9 | ||||||
|  |   device_info_plus: ^3.2.3 | ||||||
|  |  | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   flutter_test: |   flutter_test: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user