diff --git a/README.md b/README.md index c3b927d..a204d18 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ A new Flutter project. +# Content of DAY 18 ([Tutorial](https://www.youtube.com/watch?v=7EIichKmbG8&list=PLrjrqTcKCnhTXI2GyPkaQF47inLp6LoIC&index=18)) + +- Hero Animations +- MaterialPageRoute +- Arc + ## Getting Started This project is a starting point for a Flutter application. diff --git a/assets/files/catalog.json b/assets/files/catalog.json new file mode 100644 index 0000000..c52284b --- /dev/null +++ b/assets/files/catalog.json @@ -0,0 +1,68 @@ +{ + "products": [ + { + "id": 1, + "name": "iPhone 12 Pro", + "desc": "Apple iPhone 12th generation", + "price": 999, + "color": "#33505a", + "image": "https://store.storeimages.cdn-apple.com/4982/as-images.apple.com/is/iphone-12-pro-blue-hero?wid=940&hei=1112&fmt=png-alpha&qlt=80&.v=1604021661000" + }, + { + "id": 2, + "name": "Pixel 5", + "desc": "Google Pixel phone 5th generation", + "price": 699, + "color": "#00ac51", + "image": "https://www.telstra.com.au/content/dam/tcom/lego/2020/plans-devices/mobiles/google-pixel-5/shared-google-pixel-5-black-05-900x1200.png" + }, + { + "id": 3, + "name": "M1 Macbook Air", + "desc": "Apple Macbook air with apple silicon", + "price": 1099, + "color": "#e0bfae", + "image": "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP825/macbookair.png" + }, + { + "id": 4, + "name": "Playstation 5", + "desc": "Sony Playstation 5th generation", + "price": 500, + "color": "#544ee4", + "image": "https://i1.wp.com/freepngimages.com/wp-content/uploads/2020/07/Playstation-5-games-console-transparent-background-png-image.png?fit=1000%2C1000" + }, + { + "id": 5, + "name": "Airpods Pro", + "desc": "Apple Aipods Pro 1st generation", + "price": 200, + "color": "#e3e4e9", + "image": "https://crdms.images.consumerreports.org/c_lfill,w_598/prod/products/cr/models/400116-wireless-portable-headphones-apple-airpods-pro-10009323.png" + }, + { + "id": 6, + "name": "iPad Pro", + "desc": "Apple iPad Pro 2020 edition", + "price": 799, + "color": "#f73984", + "image": "https://store.storeimages.cdn-apple.com/4982/as-images.apple.com/is/ipad-pro-12-select-wifi-silver-202003_FMT_WHH?wid=940&hei=1112&fmt=png-alpha&qlt=80&.v=1583551131102" + }, + { + "id": 7, + "name": "Galaxy S21 Ultra", + "desc": "Samsung Galaxy S21 Ultra 2021 edition", + "price": 1299, + "color": "#1c1c1c", + "image": "https://lh3.googleusercontent.com/qRQPjHrhRVIs-xnfNSyiPXOH2vH97ylMacgbTKebqJtRfNH3LlYo8pN-5igsLDWUH62tGl5zNpTsl5xd8SprzGmXoCEmWFOi2-2cQVGS-r3PaRXHt62DmJHq-jrYX0UQvWZ9BA=s800-c" + }, + { + "id": 8, + "name": "Galaxy S21", + "desc": "Samsung Galaxy S21 2021 edition", + "price": 899, + "color": "#7c95eb", + "image": "https://images.samsung.com/is/image/samsung/p6pim/za/galaxy-s21/gallery/za-clear-cover-galaxy-s21-5g-ef-qg991ttegww-363168624?$720_576_PNG$" + } + ] +} \ No newline at end of file diff --git a/assets/images/hey.png b/assets/images/hey.png new file mode 100644 index 0000000..caeca23 Binary files /dev/null and b/assets/images/hey.png differ diff --git a/assets/images/login_image.png b/assets/images/login_image.png new file mode 100644 index 0000000..b175b35 Binary files /dev/null and b/assets/images/login_image.png differ diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index bbf8055..51fd2f5 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -11,7 +11,7 @@ import 'package:integration_test/integration_test.dart'; import 'package:flutter_catalog/main.dart' as app; -void main() => run(_testMain); +// void main() => run(_testMain); void _testMain() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index e8efba1..b2f5fae 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 399e934..88c2914 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 97ee771..c4f87eb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2,20 +2,26 @@ PODS: - Flutter (1.0.0) - integration_test (0.0.1): - Flutter + - path_provider (0.0.1): + - Flutter DEPENDENCIES: - Flutter (from `Flutter`) - integration_test (from `.symlinks/plugins/integration_test/ios`) + - path_provider (from `.symlinks/plugins/path_provider/ios`) EXTERNAL SOURCES: Flutter: :path: Flutter integration_test: :path: ".symlinks/plugins/integration_test/ios" + path_provider: + :path: ".symlinks/plugins/path_provider/ios" SPEC CHECKSUMS: Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c integration_test: 5ed24a436eb7ec17b6a13046e9bf7ca4a404e59e + path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c diff --git a/lib/main.dart b/lib/main.dart index dda5a28..1091413 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,22 +1,27 @@ import 'package:flutter/material.dart'; +import 'package:flutter_catalog/pages/login_page.dart'; +import 'package:flutter_catalog/utils/routes.dart'; +import 'pages/home_page.dart'; +import 'widgets/themes.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { - const MyApp({Key key}) : super(key: key); - @override Widget build(BuildContext context) { return MaterialApp( - home: Material( - child: Center( - child: Container( - child: Text("Welcome to 30 days of flutter"), - ), - ), - ), + themeMode: ThemeMode.light, + theme: MyTheme.lightTheme(context), + darkTheme: MyTheme.darkTheme(context), + debugShowCheckedModeBanner: false, + initialRoute: MyRoutes.homeRoute, + routes: { + "/": (context) => LoginPage(), + MyRoutes.homeRoute: (context) => HomePage(), + MyRoutes.loginRoute: (context) => LoginPage() + }, ); } } diff --git a/lib/models/catalog.dart b/lib/models/catalog.dart new file mode 100644 index 0000000..d13e24a --- /dev/null +++ b/lib/models/catalog.dart @@ -0,0 +1,97 @@ +import 'dart:convert'; + +class CatalogModel { + static List items; +} + +class Item { + final int id; + final String name; + final String desc; + final num price; + final String color; + final String image; + + Item({ + this.id, + this.name, + this.desc, + this.price, + this.color, + this.image, + }); + + Item copyWith({ + int id, + String name, + String desc, + num price, + String color, + String image, + }) { + return Item( + id: id ?? this.id, + name: name ?? this.name, + desc: desc ?? this.desc, + price: price ?? this.price, + color: color ?? this.color, + image: image ?? this.image, + ); + } + + Map toMap() { + return { + 'id': id, + 'name': name, + 'desc': desc, + 'price': price, + 'color': color, + 'image': image, + }; + } + + factory Item.fromMap(Map map) { + if (map == null) return null; + + return Item( + id: map['id'], + name: map['name'], + desc: map['desc'], + price: map['price'], + color: map['color'], + image: map['image'], + ); + } + + String toJson() => json.encode(toMap()); + + factory Item.fromJson(String source) => Item.fromMap(json.decode(source)); + + @override + String toString() { + return 'Item(id: $id, name: $name, desc: $desc, price: $price, color: $color, image: $image)'; + } + + @override + bool operator ==(Object o) { + if (identical(this, o)) return true; + + return o is Item && + o.id == id && + o.name == name && + o.desc == desc && + o.price == price && + o.color == color && + o.image == image; + } + + @override + int get hashCode { + return id.hashCode ^ + name.hashCode ^ + desc.hashCode ^ + price.hashCode ^ + color.hashCode ^ + image.hashCode; + } +} diff --git a/lib/pages/home_detail_page.dart b/lib/pages/home_detail_page.dart new file mode 100644 index 0000000..0eb4a33 --- /dev/null +++ b/lib/pages/home_detail_page.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/models/catalog.dart'; +import 'package:flutter_catalog/widgets/themes.dart'; +import 'package:velocity_x/velocity_x.dart'; + +class HomeDetailPage extends StatelessWidget { + final Item catalog; + + const HomeDetailPage({Key key, @required this.catalog}) + : assert(catalog != null), + super(key: key); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + backgroundColor: MyTheme.creamColor, + bottomNavigationBar: Container( + color: Colors.white, + child: ButtonBar( + alignment: MainAxisAlignment.spaceBetween, + buttonPadding: EdgeInsets.zero, + children: [ + "\$${catalog.price}".text.bold.xl4.red800.make(), + ElevatedButton( + onPressed: () {}, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + MyTheme.darkBluishColor, + ), + shape: MaterialStateProperty.all( + StadiumBorder(), + )), + child: "Buy".text.make(), + ).wh(100, 50) + ], + ).p32(), + ), + body: SafeArea( + bottom: false, + child: Column( + children: [ + Hero( + tag: Key(catalog.id.toString()), + child: Image.network(catalog.image), + ).h32(context), + Expanded( + child: VxArc( + height: 30.0, + arcType: VxArcType.CONVEY, + edge: VxEdge.TOP, + child: Container( + color: Colors.white, + width: context.screenWidth, + child: Column( + children: [ + catalog.name.text.xl4 + .color(MyTheme.darkBluishColor) + .bold + .make(), + catalog.desc.text.textStyle(context.captionStyle).xl.make(), + 10.heightBox, + ], + ).py64(), + ), + )) + ], + ), + ), + ); + } +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..2a153df --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'dart:convert'; +import 'package:flutter_catalog/models/catalog.dart'; +import 'package:flutter_catalog/widgets/home_widgets/catalog_header.dart'; +import 'package:flutter_catalog/widgets/home_widgets/catalog_list.dart'; +import 'package:flutter_catalog/widgets/themes.dart'; +import 'package:velocity_x/velocity_x.dart'; + +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + final int days = 30; + + final String name = "Codepur"; + + @override + void initState() { + super.initState(); + loadData(); + } + + loadData() async { + await Future.delayed(Duration(seconds: 2)); + final catalogJson = + await rootBundle.loadString("assets/files/catalog.json"); + final decodedData = jsonDecode(catalogJson); + var productsData = decodedData["products"]; + CatalogModel.items = List.from(productsData) + .map((item) => Item.fromMap(item)) + .toList(); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyTheme.creamColor, + body: SafeArea( + child: Container( + padding: Vx.m32, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CatalogHeader(), + if (CatalogModel.items != null && CatalogModel.items.isNotEmpty) + CatalogList().py16().expand() + else + CircularProgressIndicator().centered().expand(), + ], + ), + ), + )); + } +} diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart new file mode 100644 index 0000000..d176d74 --- /dev/null +++ b/lib/pages/login_page.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/utils/routes.dart'; + +class LoginPage extends StatefulWidget { + @override + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + String name = ""; + bool changeButton = false; + + final _formKey = GlobalKey(); + + moveToHome(BuildContext context) async { + if (_formKey.currentState.validate()) { + setState(() { + changeButton = true; + }); + await Future.delayed(Duration(seconds: 1)); + await Navigator.pushNamed(context, MyRoutes.homeRoute); + setState(() { + changeButton = false; + }); + } + } + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.white, + child: SingleChildScrollView( + child: Form( + key: _formKey, + child: Column( + children: [ + Image.asset( + "assets/images/hey.png", + fit: BoxFit.cover, + ), + SizedBox( + height: 20.0, + ), + Text( + "Welcome $name", + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + ), + ), + SizedBox( + height: 20.0, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 16.0, horizontal: 32.0), + child: Column( + children: [ + TextFormField( + decoration: InputDecoration( + hintText: "Enter username", + labelText: "Username", + ), + validator: (value) { + if (value.isEmpty) { + return "Username cannot be empty"; + } + + return null; + }, + onChanged: (value) { + name = value; + setState(() {}); + }, + ), + TextFormField( + obscureText: true, + decoration: InputDecoration( + hintText: "Enter password", + labelText: "Password", + ), + validator: (value) { + if (value.isEmpty) { + return "Password cannot be empty"; + } else if (value.length < 6) { + return "Password length should be atleast 6"; + } + + return null; + }, + ), + SizedBox( + height: 40.0, + ), + Material( + color: Colors.deepPurple, + borderRadius: + BorderRadius.circular(changeButton ? 50 : 8), + child: InkWell( + onTap: () => moveToHome(context), + child: AnimatedContainer( + duration: Duration(seconds: 1), + width: changeButton ? 50 : 150, + height: 50, + alignment: Alignment.center, + child: changeButton + ? Icon( + Icons.done, + color: Colors.white, + ) + : Text( + "Login", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ), + ), + ), + ], + ), + ) + ], + ), + ), + )); + } +} diff --git a/lib/utils/routes.dart b/lib/utils/routes.dart new file mode 100644 index 0000000..0beb868 --- /dev/null +++ b/lib/utils/routes.dart @@ -0,0 +1,5 @@ +class MyRoutes { + static String loginRoute = "/login"; + static String homeRoute = "/home"; + static String homeDetailsRoute = "/detail"; +} diff --git a/lib/widgets/drawer.dart b/lib/widgets/drawer.dart new file mode 100644 index 0000000..298d27b --- /dev/null +++ b/lib/widgets/drawer.dart @@ -0,0 +1,70 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class MyDrawer extends StatelessWidget { + @override + Widget build(BuildContext context) { + final imageUrl = + "https://avatars.githubusercontent.com/u/12619420?s=460&u=26db98cbde1dd34c7c67b85c240505a436b2c36d&v=4"; + return Drawer( + child: Container( + color: Colors.deepPurple, + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + padding: EdgeInsets.zero, + child: UserAccountsDrawerHeader( + margin: EdgeInsets.zero, + accountName: Text("Pawan Kumar"), + accountEmail: Text("mtechviral@gmail.com"), + currentAccountPicture: CircleAvatar( + backgroundImage: NetworkImage(imageUrl), + ), + ), + ), + ListTile( + leading: Icon( + CupertinoIcons.home, + color: Colors.white, + ), + title: Text( + "Home", + textScaleFactor: 1.2, + style: TextStyle( + color: Colors.white, + ), + ), + ), + ListTile( + leading: Icon( + CupertinoIcons.profile_circled, + color: Colors.white, + ), + title: Text( + "Profile", + textScaleFactor: 1.2, + style: TextStyle( + color: Colors.white, + ), + ), + ), + ListTile( + leading: Icon( + CupertinoIcons.mail, + color: Colors.white, + ), + title: Text( + "Email me", + textScaleFactor: 1.2, + style: TextStyle( + color: Colors.white, + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/home_widgets/catalog_header.dart b/lib/widgets/home_widgets/catalog_header.dart new file mode 100644 index 0000000..97a1115 --- /dev/null +++ b/lib/widgets/home_widgets/catalog_header.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/widgets/themes.dart'; +import 'package:velocity_x/velocity_x.dart'; + +class CatalogHeader extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Catalog App".text.xl5.bold.color(MyTheme.darkBluishColor).make(), + "Trending products".text.xl2.make(), + ], + ); + } +} diff --git a/lib/widgets/home_widgets/catalog_image.dart b/lib/widgets/home_widgets/catalog_image.dart new file mode 100644 index 0000000..15b751e --- /dev/null +++ b/lib/widgets/home_widgets/catalog_image.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/widgets/themes.dart'; +import 'package:velocity_x/velocity_x.dart'; + +class CatalogImage extends StatelessWidget { + final String image; + + const CatalogImage({Key key, @required this.image}) : super(key: key); + @override + Widget build(BuildContext context) { + return Image.network( + image, + ).box.rounded.p8.color(MyTheme.creamColor).make().p16().w40(context); + } +} diff --git a/lib/widgets/home_widgets/catalog_list.dart b/lib/widgets/home_widgets/catalog_list.dart new file mode 100644 index 0000000..b4d5a70 --- /dev/null +++ b/lib/widgets/home_widgets/catalog_list.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/models/catalog.dart'; +import 'package:flutter_catalog/pages/home_detail_page.dart'; +import 'package:flutter_catalog/widgets/themes.dart'; +import 'package:velocity_x/velocity_x.dart'; + +import 'catalog_image.dart'; + +class CatalogList extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListView.builder( + shrinkWrap: true, + itemCount: CatalogModel.items.length, + itemBuilder: (context, index) { + final catalog = CatalogModel.items[index]; + return InkWell( + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomeDetailPage( + catalog: catalog, + ), + ), + ), + child: CatalogItem(catalog: catalog), + ); + }, + ); + } +} + +class CatalogItem extends StatelessWidget { + final Item catalog; + + const CatalogItem({Key key, @required this.catalog}) + : assert(catalog != null), + super(key: key); + + @override + Widget build(BuildContext context) { + return VxBox( + child: Row( + children: [ + Hero( + tag: Key(catalog.id.toString()), + child: CatalogImage( + image: catalog.image, + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + catalog.name.text.lg.color(MyTheme.darkBluishColor).bold.make(), + catalog.desc.text.textStyle(context.captionStyle).make(), + 10.heightBox, + ButtonBar( + alignment: MainAxisAlignment.spaceBetween, + buttonPadding: EdgeInsets.zero, + children: [ + "\$${catalog.price}".text.bold.xl.make(), + ElevatedButton( + onPressed: () {}, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + MyTheme.darkBluishColor, + ), + shape: MaterialStateProperty.all( + StadiumBorder(), + )), + child: "Buy".text.make(), + ) + ], + ).pOnly(right: 8.0) + ], + )) + ], + ), + ).white.rounded.square(150).make().py16(); + } +} diff --git a/lib/widgets/item_widget.dart b/lib/widgets/item_widget.dart new file mode 100644 index 0000000..7bc5396 --- /dev/null +++ b/lib/widgets/item_widget.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_catalog/models/catalog.dart'; + +class ItemWidget extends StatelessWidget { + final Item item; + + const ItemWidget({Key key, @required this.item}) + : assert(item != null), + super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + child: ListTile( + onTap: () { + print("${item.name} pressed"); + }, + leading: Image.network(item.image), + title: Text(item.name), + subtitle: Text(item.desc), + trailing: Text( + "\$${item.price}", + textScaleFactor: 1.5, + style: TextStyle( + color: Colors.deepPurple, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/themes.dart b/lib/widgets/themes.dart new file mode 100644 index 0000000..5cbbda0 --- /dev/null +++ b/lib/widgets/themes.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class MyTheme { + static ThemeData lightTheme(BuildContext context) => ThemeData( + primarySwatch: Colors.deepPurple, + fontFamily: GoogleFonts.poppins().fontFamily, + appBarTheme: AppBarTheme( + color: Colors.white, + elevation: 0.0, + iconTheme: IconThemeData(color: Colors.black), + textTheme: Theme.of(context).textTheme, + )); + + static ThemeData darkTheme(BuildContext context) => ThemeData( + brightness: Brightness.dark, + ); + + //Colors + static Color creamColor = Color(0xfff5f5f5); + static Color darkBluishColor = Color(0xff403b58); +} diff --git a/pubspec.lock b/pubspec.lock index 62bef60..7bae492 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,20 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - _fe_analyzer_shared: + animator: dependency: transitive description: - name: _fe_analyzer_shared + name: animator url: "https://pub.dartlang.org" source: hosted - version: "12.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "0.40.6" + version: "2.0.2" archive: dependency: transitive description: @@ -35,49 +28,49 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety.3" + version: "2.5.0" + auto_size_text: + dependency: transitive + description: + name: auto_size_text + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.5" + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.3" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" + version: "1.2.0" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.5" + version: "1.15.0" convert: dependency: transitive description: @@ -85,13 +78,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "0.14.2" crypto: dependency: transitive description: @@ -112,14 +98,21 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.3" + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" file: dependency: transitive description: name: file url: "https://pub.dartlang.org" source: hosted - version: "6.0.0-nullsafety.4" + version: "6.0.0" flutter: dependency: "direct main" description: flutter @@ -140,88 +133,95 @@ packages: description: flutter source: sdk version: "0.0.0" - glob: + google_fonts: + dependency: "direct main" + description: + name: google_fonts + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + http: dependency: transitive description: - name: glob + name: http url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "0.12.2" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.4" integration_test: dependency: "direct dev" description: flutter source: sdk version: "0.9.2+2" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.4" - js: + intl: dependency: transitive description: - name: js + name: intl url: "https://pub.dartlang.org" source: hosted - version: "0.6.3-nullsafety.3" - json_rpc_2: + version: "0.16.1" + matcher: dependency: transitive description: - name: json_rpc_2 + name: matcher url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" - logging: + version: "0.12.10" + meta: dependency: transitive description: - name: logging + name: meta url: "https://pub.dartlang.org" source: hosted - version: "0.11.4" - matcher: + version: "1.3.0" + path: dependency: transitive description: - name: matcher + name: path url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety.3" - meta: + version: "1.8.0" + path_provider: dependency: transitive description: - name: meta + name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.6" - node_interop: + version: "1.6.27" + path_provider_linux: dependency: transitive description: - name: node_interop + name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" - node_io: + version: "0.0.1+2" + path_provider_macos: dependency: transitive description: - name: node_io + name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" - package_config: + version: "0.0.4+8" + path_provider_platform_interface: dependency: transitive description: - name: package_config + name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" - path: + version: "1.0.4" + path_provider_windows: dependency: transitive description: - name: path + name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.3" + version: "0.0.4+3" pedantic: dependency: transitive description: @@ -235,75 +235,61 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.4" - pool: + version: "3.0.0" + plugin_platform_interface: dependency: transitive description: - name: pool + name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.5.0-nullsafety.3" + version: "1.0.3" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.0.0-nullsafety.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.4" + version: "4.0.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0-nullsafety.4" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10-nullsafety.3" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.4" + version: "1.8.0" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.6" + version: "1.10.0" + states_rebuilder: + dependency: transitive + description: + name: states_rebuilder + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" sync_http: dependency: transitive description: @@ -317,35 +303,35 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.3" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety.6" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.12-nullsafety.9" + version: "0.2.19" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.5" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.5" + version: "2.1.0" + velocity_x: + dependency: "direct main" + description: + name: velocity_x + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.1" vm_service: dependency: transitive description: @@ -353,33 +339,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.5.0" - watcher: + vxstate: dependency: transitive description: - name: watcher + name: vxstate url: "https://pub.dartlang.org" source: hosted - version: "0.9.7+15" - web_socket_channel: + version: "1.0.1" + webdriver: dependency: transitive description: - name: web_socket_channel + name: webdriver url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" - webdriver: + version: "2.1.2" + win32: dependency: transitive description: - name: webdriver + name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" - yaml: + version: "1.7.4+1" + xdg_directories: dependency: transitive description: - name: yaml + name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "0.1.2" sdks: dart: ">=2.12.0-0.0 <3.0.0" + flutter: ">=1.17.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8efae22..793406d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,10 +23,9 @@ environment: dependencies: flutter: sdk: flutter - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.1 + google_fonts: ^1.1.2 + velocity_x: ^1.4.1 dev_dependencies: flutter_test: @@ -36,7 +35,6 @@ dev_dependencies: # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec - # The following section is specific to Flutter. flutter: # The following line ensures that the Material Icons font is @@ -45,16 +43,14 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg + assets: + - assets/images/ + - assets/files/ # - images/a_dot_ham.jpeg - # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. - # For details regarding adding assets from package dependencies, see # https://flutter.dev/assets-and-images/#from-packages - # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a