├── .gitignore ├── .metadata ├── README.md ├── assets ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── g0.png │ ├── g1.png │ ├── g2.png │ ├── g3.png │ ├── g4.png │ ├── g5.png │ ├── g6.jpg │ ├── g6.png │ ├── img1.png │ ├── img2.png │ ├── l1.png │ ├── nfx.png │ ├── nfx1.png │ ├── nfx2.png │ ├── nfx_logo.png │ ├── op.png │ ├── ps4.png │ ├── ps5.png │ └── r1.png └── sounds │ ├── 1.mp3 │ ├── 1.wav │ └── 2.mp3 ├── lib ├── main.dart ├── models │ ├── job.dart │ └── people.dart ├── utils │ ├── fa_progress.dart │ ├── margin.dart │ ├── navigator.dart │ ├── spring_button.dart │ └── theme.dart └── views │ ├── board.dart │ ├── home.dart │ ├── menu.dart │ ├── netflix.dart │ ├── netflix_home.dart │ ├── provider │ ├── netflix_vm.dart │ └── ps5.dart │ └── ps5.dart ├── macos ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── app_icon_1024.png │ │ ├── app_icon_128.png │ │ ├── app_icon_16.png │ │ ├── app_icon_256.png │ │ ├── app_icon_32.png │ │ ├── app_icon_512.png │ │ └── app_icon_64.png │ ├── Base.lproj │ └── MainMenu.xib │ ├── Configs │ ├── AppInfo.xcconfig │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── Warnings.xcconfig │ ├── DebugProfile.entitlements │ ├── Info.plist │ ├── MainFlutterWindow.swift │ └── Release.entitlements ├── pubspec.lock ├── pubspec.yaml ├── screenshot ├── info.png └── splash.gif ├── test └── widget_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png └── Icon-512.png ├── index.html └── manifest.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Exceptions to above rules. 44 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 45 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: c2b7342ca470b11cfaad4fbfb094f73aa4c85320 8 | channel: dev 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flutter-desktop-examples 2 | 3 | A flutter desktop UI implementation. 4 | 5 |

6 | 7 | 8 | ## Notes (Apply Caution) 9 | Fore some reason ReorderableListView has a Material Widget with a shadow i had to remove mine to make the UI cleaner the file is at: 10 | ``` 11 | /flutter/packages/flutter/lib/src/material/reorderable_list.dart 12 | ``` 13 |

14 | 15 | -------------------------------------------------------------------------------- /assets/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/1.png -------------------------------------------------------------------------------- /assets/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/10.png -------------------------------------------------------------------------------- /assets/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/11.png -------------------------------------------------------------------------------- /assets/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/2.png -------------------------------------------------------------------------------- /assets/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/3.png -------------------------------------------------------------------------------- /assets/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/4.png -------------------------------------------------------------------------------- /assets/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/5.png -------------------------------------------------------------------------------- /assets/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/6.png -------------------------------------------------------------------------------- /assets/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/7.png -------------------------------------------------------------------------------- /assets/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/8.png -------------------------------------------------------------------------------- /assets/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/9.png -------------------------------------------------------------------------------- /assets/images/g0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g0.png -------------------------------------------------------------------------------- /assets/images/g1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g1.png -------------------------------------------------------------------------------- /assets/images/g2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g2.png -------------------------------------------------------------------------------- /assets/images/g3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g3.png -------------------------------------------------------------------------------- /assets/images/g4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g4.png -------------------------------------------------------------------------------- /assets/images/g5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g5.png -------------------------------------------------------------------------------- /assets/images/g6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g6.jpg -------------------------------------------------------------------------------- /assets/images/g6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/g6.png -------------------------------------------------------------------------------- /assets/images/img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/img1.png -------------------------------------------------------------------------------- /assets/images/img2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/img2.png -------------------------------------------------------------------------------- /assets/images/l1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/l1.png -------------------------------------------------------------------------------- /assets/images/nfx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/nfx.png -------------------------------------------------------------------------------- /assets/images/nfx1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/nfx1.png -------------------------------------------------------------------------------- /assets/images/nfx2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/nfx2.png -------------------------------------------------------------------------------- /assets/images/nfx_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/nfx_logo.png -------------------------------------------------------------------------------- /assets/images/op.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/op.png -------------------------------------------------------------------------------- /assets/images/ps4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/ps4.png -------------------------------------------------------------------------------- /assets/images/ps5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/ps5.png -------------------------------------------------------------------------------- /assets/images/r1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/images/r1.png -------------------------------------------------------------------------------- /assets/sounds/1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/sounds/1.mp3 -------------------------------------------------------------------------------- /assets/sounds/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/sounds/1.wav -------------------------------------------------------------------------------- /assets/sounds/2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/assets/sounds/2.mp3 -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:musicapp/utils/theme.dart'; 3 | import 'package:musicapp/views/ps5.dart'; 4 | import 'package:provider/provider.dart'; 5 | 6 | import 'views/netflix.dart'; 7 | import 'views/netflix_home.dart'; 8 | import 'views/provider/netflix_vm.dart'; 9 | import 'views/provider/ps5.dart'; 10 | 11 | void main() { 12 | runApp(MyApp()); 13 | } 14 | 15 | class MyApp extends StatelessWidget { 16 | // This widget is the root of your application. 17 | @override 18 | Widget build(BuildContext context) { 19 | return MultiProvider( 20 | providers: [ 21 | ChangeNotifierProvider(create: (context) => Ps5VM()), 22 | ChangeNotifierProvider(create: (context) => NetflixVM()), 23 | ], 24 | child: MaterialApp( 25 | title: 'musicapp', 26 | theme: themeData(context), 27 | debugShowCheckedModeBanner: false, 28 | color: Colors.red, 29 | home: NetflixHome(), 30 | ), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/models/job.dart: -------------------------------------------------------------------------------- 1 | class Job { 2 | final String title; 3 | final String price; 4 | final bool selected; 5 | 6 | Job({this.title, this.price, this.selected = false}); 7 | } 8 | -------------------------------------------------------------------------------- /lib/models/people.dart: -------------------------------------------------------------------------------- 1 | class People { 2 | final String name; 3 | final String job; 4 | final bool m; 5 | final List lang; 6 | 7 | People({this.name, this.job, this.m = false, this.lang}); 8 | } 9 | 10 | -------------------------------------------------------------------------------- /lib/utils/fa_progress.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/animation.dart'; 2 | import 'package:flutter/widgets.dart'; 3 | 4 | class FAProgressBar extends StatefulWidget { 5 | FAProgressBar( 6 | {Key key, 7 | this.currentValue = 0, 8 | this.maxValue = 100, 9 | this.size = 30, 10 | this.animatedDuration = const Duration(milliseconds: 300), 11 | this.direction = Axis.horizontal, 12 | this.verticalDirection = VerticalDirection.down, 13 | this.borderRadius = 8, 14 | this.backgroundColor = const Color(0x00FFFFFF), 15 | this.progressColor = const Color(0xFFFA7268), 16 | this.changeColorValue, 17 | this.displayWidget, 18 | this.changeProgressColor = const Color(0xFF5F4B8B), 19 | }) 20 | : super(key: key); 21 | final int currentValue; 22 | final int maxValue; 23 | final double size; 24 | final Duration animatedDuration; 25 | final Axis direction; 26 | final VerticalDirection verticalDirection; 27 | final double borderRadius; 28 | final Color backgroundColor; 29 | final Color progressColor; 30 | final int changeColorValue; 31 | final Color changeProgressColor; 32 | final Widget displayWidget; 33 | 34 | @override 35 | _FAProgressBarState createState() => _FAProgressBarState(); 36 | } 37 | 38 | class _FAProgressBarState extends State 39 | with SingleTickerProviderStateMixin { 40 | Animation _animation; 41 | AnimationController _controller; 42 | double _currentBegin = 0.4; 43 | double _currentEnd = 0; 44 | 45 | @override 46 | void initState() { 47 | _controller = 48 | AnimationController(duration: widget.animatedDuration, vsync: this); 49 | _animation = Tween(begin: _currentBegin, end: _currentEnd) 50 | .animate(_controller); 51 | triggerAnimation(); 52 | super.initState(); 53 | } 54 | 55 | @override 56 | void didUpdateWidget(FAProgressBar old) { 57 | triggerAnimation(); 58 | super.didUpdateWidget(old); 59 | } 60 | 61 | void triggerAnimation() { 62 | setState(() { 63 | _currentBegin = _animation.value; 64 | _currentEnd = widget.currentValue / widget.maxValue; 65 | _animation = Tween(begin: _currentBegin, end: _currentEnd) 66 | .animate(_controller); 67 | }); 68 | _controller.reset(); 69 | _controller.forward(); 70 | } 71 | 72 | @override 73 | Widget build(BuildContext context) => AnimatedProgressBar( 74 | animation: _animation, 75 | widget: widget, 76 | ); 77 | 78 | @override 79 | void dispose() { 80 | _controller.dispose(); 81 | super.dispose(); 82 | } 83 | } 84 | 85 | class AnimatedProgressBar extends AnimatedWidget { 86 | AnimatedProgressBar({ 87 | Key key, 88 | Animation animation, 89 | this.widget, 90 | }) : super(key: key, listenable: animation); 91 | final FAProgressBar widget; 92 | 93 | double transformValue(x, begin, end, before) { 94 | double y = (end * x - (begin - before)) * (1 / before); 95 | return y < 0 ? 0 : ((y > 1) ? 1 : y); 96 | } 97 | 98 | Widget build(BuildContext context) { 99 | final Animation animation = listenable; 100 | Color progressColor = widget.progressColor; 101 | 102 | if (widget.changeColorValue != null) { 103 | final _colorTween = ColorTween( 104 | begin: widget.progressColor, end: widget.changeProgressColor); 105 | progressColor = _colorTween.transform(transformValue( 106 | animation.value, widget.changeColorValue, widget.maxValue, 5)); 107 | } 108 | 109 | List progressWidgets = []; 110 | Widget progressWidget = new Container( 111 | decoration: BoxDecoration( 112 | color: progressColor, 113 | borderRadius: BorderRadius.circular(widget.borderRadius), 114 | ), 115 | ); 116 | progressWidgets.add(progressWidget); 117 | 118 | if (widget.displayWidget != null) { 119 | Widget textProgress = new Container( 120 | alignment: widget.direction == Axis.horizontal 121 | ? FractionalOffset(0.05, 0.5) 122 | : (widget.verticalDirection == VerticalDirection.up 123 | ? FractionalOffset(0.5, 0.05) 124 | : FractionalOffset(0.5, 0.95)), 125 | child: widget 126 | .displayWidget /* Text( 127 | (animation.value * widget.maxValue).toInt().toString() + 128 | widget.displayText, 129 | softWrap: false, 130 | style: TextStyle(color: const Color(0xFFFFFFFF), fontSize: 12)) */ 131 | ); 132 | progressWidgets.add(textProgress); 133 | } 134 | 135 | return Directionality( 136 | textDirection: TextDirection.ltr, 137 | child: Container( 138 | width: widget.direction == Axis.vertical ? widget.size : null, 139 | height: widget.direction == Axis.horizontal ? widget.size : null, 140 | decoration: BoxDecoration( 141 | color: widget.backgroundColor, 142 | borderRadius: BorderRadius.circular(widget.borderRadius), 143 | ), 144 | child: Flex( 145 | direction: widget.direction, 146 | verticalDirection: widget.verticalDirection, 147 | children: [ 148 | Expanded( 149 | flex: (animation.value * 100).toInt(), 150 | child: Stack(children: progressWidgets)), 151 | Expanded( 152 | flex: 100 - (animation.value * 100).toInt(), child: Container()) 153 | ], 154 | ), 155 | ), 156 | ); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /lib/utils/margin.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class XMargin extends StatelessWidget { 4 | final double x; 5 | const XMargin(this.x); 6 | @override 7 | Widget build(BuildContext context) { 8 | return SizedBox(width: x); 9 | } 10 | } 11 | 12 | class YMargin extends StatelessWidget { 13 | final double y; 14 | const YMargin(this.y); 15 | @override 16 | Widget build(BuildContext context) { 17 | return SizedBox(height: y); 18 | } 19 | } 20 | 21 | extension CustomContext on BuildContext { 22 | double screenHeight([double percent = 1]) => 23 | MediaQuery.of(this).size.height * percent; 24 | 25 | double screenWidth([double percent = 1]) => 26 | MediaQuery.of(this).size.width * percent; 27 | } 28 | -------------------------------------------------------------------------------- /lib/utils/navigator.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | navigateReplace(context, Widget route, {isDialog = false}) => 4 | Navigator.pushReplacement( 5 | context, 6 | MaterialPageRoute( 7 | fullscreenDialog: isDialog, 8 | builder: (context) => route, 9 | ), 10 | ); 11 | 12 | navigate(context, Widget route, {isDialog = false}) => Navigator.push( 13 | context, 14 | MaterialPageRoute( 15 | fullscreenDialog: isDialog, 16 | builder: (context) => route, 17 | ), 18 | ); 19 | 20 | popToFirst(context) => Navigator.of(context).popUntil((route) => route.isFirst); 21 | 22 | popView(context) => Navigator.pop(context); 23 | 24 | navigateTransparentRoute(context, Widget route) { 25 | return Navigator.push( 26 | context, 27 | TransparentRoute( 28 | builder: (context) => route, 29 | ), 30 | ); 31 | } 32 | 33 | class TransparentRoute extends PageRoute { 34 | TransparentRoute({ 35 | @required this.builder, 36 | RouteSettings settings, 37 | }) : assert(builder != null), 38 | super(settings: settings, fullscreenDialog: false); 39 | 40 | final WidgetBuilder builder; 41 | 42 | @override 43 | bool get opaque => false; 44 | 45 | @override 46 | Color get barrierColor => null; 47 | 48 | @override 49 | String get barrierLabel => null; 50 | 51 | @override 52 | bool get maintainState => true; 53 | 54 | @override 55 | Duration get transitionDuration => Duration(milliseconds: 350); 56 | 57 | @override 58 | Widget buildPage(BuildContext context, Animation animation, 59 | Animation secondaryAnimation) { 60 | final result = builder(context); 61 | return FadeTransition( 62 | opacity: Tween(begin: 0, end: 1).animate(animation), 63 | child: Semantics( 64 | scopesRoute: true, 65 | explicitChildNodes: true, 66 | child: result, 67 | ), 68 | ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /lib/utils/spring_button.dart: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // © Cosmos Software | Ali Yigit Bireroglu / 3 | // All material used in the making of this code, project, program, application, software et cetera (the "Intellectual Property") / 4 | // belongs completely and solely to Ali Yigit Bireroglu. This includes but is not limited to the source code, the multimedia and / 5 | // other asset files. If you were granted this Intellectual Property for personal use, you are obligated to include this copyright / 6 | // text at all times. / 7 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | 9 | import 'package:flutter/material.dart'; 10 | 11 | enum SpringButtonType { 12 | OnlyScale, 13 | WithOpacity, 14 | } 15 | 16 | class SpringButton extends StatefulWidget { 17 | ///Use this value to determine the type of animation to be played. 18 | final SpringButtonType springButtonType; 19 | 20 | ///The widget that is to be displayed on your regular UI. 21 | Widget child; 22 | 23 | ///Set this to true if your [child] doesn't change at runtime. 24 | final bool useCache; 25 | 26 | ///Use this value to determine the alignment of the animation. 27 | final Alignment alignment; 28 | 29 | ///Use this value to determine the scaling factor while the animation is being played. Choose a value between 0.0 and 1.0. 30 | final double scaleCoefficient; 31 | 32 | final GestureTapDownCallback onTapDown; 33 | final GestureTapUpCallback onTapUp; 34 | final GestureTapCallback onTap; 35 | final GestureTapCancelCallback onTapCancel; 36 | final GestureTapDownCallback onSecondaryTapDown; 37 | final GestureTapUpCallback onSecondaryTapUp; 38 | final GestureTapCancelCallback onSecondaryTapCancel; 39 | final GestureTapCallback onDoubleTap; 40 | final GestureLongPressCallback onLongPress; 41 | final GestureLongPressStartCallback onLongPressStart; 42 | final GestureLongPressMoveUpdateCallback onLongPressMoveUpdate; 43 | final GestureLongPressUpCallback onLongPressUp; 44 | final GestureLongPressEndCallback onLongPressEnd; 45 | final GestureDragDownCallback onVerticalDragDown; 46 | final GestureDragStartCallback onVerticalDragStart; 47 | final GestureDragUpdateCallback onVerticalDragUpdate; 48 | final GestureDragEndCallback onVerticalDragEnd; 49 | final GestureDragCancelCallback onVerticalDragCancel; 50 | final GestureDragDownCallback onHorizontalDragDown; 51 | final GestureDragStartCallback onHorizontalDragStart; 52 | final GestureDragUpdateCallback onHorizontalDragUpdate; 53 | final GestureDragEndCallback onHorizontalDragEnd; 54 | final GestureDragCancelCallback onHorizontalDragCancel; 55 | final GestureDragDownCallback onPanDown; 56 | final GestureDragStartCallback onPanStart; 57 | final GestureDragUpdateCallback onPanUpdate; 58 | final GestureDragEndCallback onPanEnd; 59 | final GestureDragCancelCallback onPanCancel; 60 | final GestureScaleStartCallback onScaleStart; 61 | final GestureScaleUpdateCallback onScaleUpdate; 62 | final GestureScaleEndCallback onScaleEnd; 63 | final GestureForcePressStartCallback onForcePressStart; 64 | final GestureForcePressPeakCallback onForcePressPeak; 65 | final GestureForcePressUpdateCallback onForcePressUpdate; 66 | final GestureForcePressEndCallback onForcePressEnd; 67 | 68 | SpringButton( 69 | { 70 | this.child, 71 | this.springButtonType = SpringButtonType.OnlyScale, 72 | Key key, 73 | this.useCache: true, 74 | this.alignment: Alignment.center, 75 | this.scaleCoefficient: 0.75, 76 | this.onTapDown, 77 | this.onTapUp, 78 | this.onTap, 79 | this.onTapCancel, 80 | this.onSecondaryTapDown, 81 | this.onSecondaryTapUp, 82 | this.onSecondaryTapCancel, 83 | this.onDoubleTap, 84 | this.onLongPress, 85 | this.onLongPressStart, 86 | this.onLongPressMoveUpdate, 87 | this.onLongPressUp, 88 | this.onLongPressEnd, 89 | this.onVerticalDragDown, 90 | this.onVerticalDragStart, 91 | this.onVerticalDragUpdate, 92 | this.onVerticalDragEnd, 93 | this.onVerticalDragCancel, 94 | this.onHorizontalDragDown, 95 | this.onHorizontalDragStart, 96 | this.onHorizontalDragUpdate, 97 | this.onHorizontalDragEnd, 98 | this.onHorizontalDragCancel, 99 | this.onForcePressStart, 100 | this.onForcePressPeak, 101 | this.onForcePressUpdate, 102 | this.onForcePressEnd, 103 | this.onPanDown, 104 | this.onPanStart, 105 | this.onPanUpdate, 106 | this.onPanEnd, 107 | this.onPanCancel, 108 | this.onScaleStart, 109 | this.onScaleUpdate, 110 | this.onScaleEnd, 111 | }) : assert(scaleCoefficient >= 0.0 && scaleCoefficient <= 1.0), 112 | super(key: key); 113 | 114 | @override 115 | SpringButtonState createState() => SpringButtonState( 116 | springButtonType, 117 | useCache, 118 | alignment, 119 | scaleCoefficient, 120 | onTapDown, 121 | onTapUp, 122 | onTap, 123 | onTapCancel, 124 | onSecondaryTapDown, 125 | onSecondaryTapUp, 126 | onSecondaryTapCancel, 127 | onDoubleTap, 128 | onLongPress, 129 | onLongPressStart, 130 | onLongPressMoveUpdate, 131 | onLongPressUp, 132 | onLongPressEnd, 133 | onVerticalDragDown, 134 | onVerticalDragStart, 135 | onVerticalDragUpdate, 136 | onVerticalDragEnd, 137 | onVerticalDragCancel, 138 | onHorizontalDragDown, 139 | onHorizontalDragStart, 140 | onHorizontalDragUpdate, 141 | onHorizontalDragEnd, 142 | onHorizontalDragCancel, 143 | onForcePressStart, 144 | onForcePressPeak, 145 | onForcePressUpdate, 146 | onForcePressEnd, 147 | onPanDown, 148 | onPanStart, 149 | onPanUpdate, 150 | onPanEnd, 151 | onPanCancel, 152 | onScaleStart, 153 | onScaleUpdate, 154 | onScaleEnd, 155 | ); 156 | } 157 | 158 | class SpringButtonState extends State 159 | with SingleTickerProviderStateMixin { 160 | final SpringButtonType springButtonType; 161 | Widget child; 162 | final bool useCache; 163 | final Alignment alignment; 164 | final double scaleCoefficient; 165 | 166 | final GestureTapDownCallback onTapDown; 167 | final GestureTapUpCallback onTapUp; 168 | final GestureTapCallback onTap; 169 | final GestureTapCancelCallback onTapCancel; 170 | final GestureTapDownCallback onSecondaryTapDown; 171 | final GestureTapUpCallback onSecondaryTapUp; 172 | final GestureTapCancelCallback onSecondaryTapCancel; 173 | final GestureTapCallback onDoubleTap; 174 | final GestureLongPressCallback onLongPress; 175 | final GestureLongPressStartCallback onLongPressStart; 176 | final GestureLongPressMoveUpdateCallback onLongPressMoveUpdate; 177 | final GestureLongPressUpCallback onLongPressUp; 178 | final GestureLongPressEndCallback onLongPressEnd; 179 | final GestureDragDownCallback onVerticalDragDown; 180 | final GestureDragStartCallback onVerticalDragStart; 181 | final GestureDragUpdateCallback onVerticalDragUpdate; 182 | final GestureDragEndCallback onVerticalDragEnd; 183 | final GestureDragCancelCallback onVerticalDragCancel; 184 | final GestureDragDownCallback onHorizontalDragDown; 185 | final GestureDragStartCallback onHorizontalDragStart; 186 | final GestureDragUpdateCallback onHorizontalDragUpdate; 187 | final GestureDragEndCallback onHorizontalDragEnd; 188 | final GestureDragCancelCallback onHorizontalDragCancel; 189 | final GestureDragDownCallback onPanDown; 190 | final GestureDragStartCallback onPanStart; 191 | final GestureDragUpdateCallback onPanUpdate; 192 | final GestureDragEndCallback onPanEnd; 193 | final GestureDragCancelCallback onPanCancel; 194 | final GestureScaleStartCallback onScaleStart; 195 | final GestureScaleUpdateCallback onScaleUpdate; 196 | final GestureScaleEndCallback onScaleEnd; 197 | final GestureForcePressStartCallback onForcePressStart; 198 | final GestureForcePressPeakCallback onForcePressPeak; 199 | final GestureForcePressUpdateCallback onForcePressUpdate; 200 | final GestureForcePressEndCallback onForcePressEnd; 201 | 202 | ///The [AnimationController] used to create the spring effect. 203 | AnimationController animationController; 204 | Animation animation; 205 | 206 | bool isSpringDown = false; 207 | 208 | bool isEnabled = true; 209 | 210 | ///Use this value to determine the depth of debug logging that is actually only here for myself and the Swiss scientists. 211 | final int _debugLevel = 0; 212 | 213 | SpringButtonState( 214 | this.springButtonType, 215 | this.useCache, 216 | this.alignment, 217 | this.scaleCoefficient, 218 | this.onTapDown, 219 | this.onTapUp, 220 | this.onTap, 221 | this.onTapCancel, 222 | this.onSecondaryTapDown, 223 | this.onSecondaryTapUp, 224 | this.onSecondaryTapCancel, 225 | this.onDoubleTap, 226 | this.onLongPress, 227 | this.onLongPressStart, 228 | this.onLongPressMoveUpdate, 229 | this.onLongPressUp, 230 | this.onLongPressEnd, 231 | this.onVerticalDragDown, 232 | this.onVerticalDragStart, 233 | this.onVerticalDragUpdate, 234 | this.onVerticalDragEnd, 235 | this.onVerticalDragCancel, 236 | this.onHorizontalDragDown, 237 | this.onHorizontalDragStart, 238 | this.onHorizontalDragUpdate, 239 | this.onHorizontalDragEnd, 240 | this.onHorizontalDragCancel, 241 | this.onForcePressStart, 242 | this.onForcePressPeak, 243 | this.onForcePressUpdate, 244 | this.onForcePressEnd, 245 | this.onPanDown, 246 | this.onPanStart, 247 | this.onPanUpdate, 248 | this.onPanEnd, 249 | this.onPanCancel, 250 | this.onScaleStart, 251 | this.onScaleUpdate, 252 | this.onScaleEnd, 253 | ); 254 | 255 | @override 256 | void initState() { 257 | super.initState(); 258 | 259 | if (useCache) child = wrapper(); 260 | 261 | animationController = AnimationController( 262 | vsync: this, 263 | lowerBound: 0.0, 264 | upperBound: 1.0, 265 | duration: const Duration(milliseconds: 2000), 266 | ); 267 | animationController.value = 1; 268 | animation = Tween( 269 | begin: scaleCoefficient, 270 | end: 1.0, 271 | ).animate( 272 | CurvedAnimation( 273 | parent: animationController, 274 | curve: Curves.elasticOut, 275 | ), 276 | ); 277 | } 278 | 279 | @override 280 | void dispose() { 281 | animationController.dispose(); 282 | 283 | super.dispose(); 284 | } 285 | 286 | bool get hasMultiple { 287 | List list = [ 288 | hasTap, 289 | hasSecondaryTap, 290 | hasDoubleTap, 291 | hasLongPress, 292 | hasVerticalDrag, 293 | hasHorizontalDrag, 294 | hasForcePress, 295 | hasPan, 296 | hasScale 297 | ]; 298 | return list.where((bool b) => b).length > 1; 299 | } 300 | 301 | bool get hasTap => 302 | onTapDown != null || 303 | onTapUp != null || 304 | onTap != null || 305 | onTapCancel != null; 306 | bool get hasSecondaryTap => 307 | onSecondaryTapDown != null || 308 | onSecondaryTapUp != null || 309 | onSecondaryTapCancel != null; 310 | bool get hasDoubleTap => onDoubleTap != null; 311 | bool get hasLongPress => 312 | onLongPress != null || 313 | onLongPressStart != null || 314 | onLongPressMoveUpdate != null || 315 | onLongPressUp != null || 316 | onLongPressEnd != null; 317 | bool get hasVerticalDrag => 318 | onVerticalDragDown != null || 319 | onVerticalDragStart != null || 320 | onVerticalDragUpdate != null || 321 | onVerticalDragEnd != null || 322 | onVerticalDragCancel != null; 323 | bool get hasHorizontalDrag => 324 | onHorizontalDragDown != null || 325 | onHorizontalDragStart != null || 326 | onHorizontalDragUpdate != null || 327 | onHorizontalDragEnd != null || 328 | onHorizontalDragCancel != null; 329 | bool get hasForcePress => 330 | onForcePressStart != null || 331 | onForcePressPeak != null || 332 | onForcePressUpdate != null || 333 | onForcePressEnd != null; 334 | bool get hasPan => 335 | onPanDown != null || 336 | onPanStart != null || 337 | onPanUpdate != null || 338 | onPanCancel != null; 339 | bool get hasScale => 340 | onScaleStart != null || onScaleUpdate != null || onScaleEnd != null; 341 | 342 | void enable() { 343 | if (!isEnabled) { 344 | animationController.value = 1.0; 345 | isSpringDown = false; 346 | isEnabled = true; 347 | } 348 | } 349 | 350 | void disable() { 351 | if (isEnabled) { 352 | animationController.value = 1.0; 353 | isSpringDown = false; 354 | isEnabled = false; 355 | } 356 | } 357 | 358 | void springDown() { 359 | if (!isEnabled) return; 360 | 361 | if (_debugLevel > 0) print("springDown"); 362 | 363 | isSpringDown = true; 364 | animationController.value = 0; 365 | } 366 | 367 | Future spring() async { 368 | if (!isEnabled) return; 369 | 370 | if (_debugLevel > 0) print("spring-1"); 371 | 372 | isSpringDown = false; 373 | 374 | if (hasMultiple) await Future.delayed(const Duration(milliseconds: 5)); 375 | 376 | if (_debugLevel > 0) print("spring-2"); 377 | 378 | if (!isSpringDown) animationController.forward(); 379 | } 380 | 381 | Future springUp() async { 382 | if (!isEnabled) return; 383 | 384 | if (_debugLevel > 0) print("springUp-1"); 385 | 386 | isSpringDown = false; 387 | 388 | if (hasMultiple) await Future.delayed(const Duration(milliseconds: 500)); 389 | 390 | if (_debugLevel > 0) print("springUp-2"); 391 | 392 | if (!isSpringDown) animationController.value = 1; 393 | } 394 | 395 | Widget wrapper() { 396 | return GestureDetector( 397 | behavior: HitTestBehavior.translucent, 398 | onTapDown: !hasTap 399 | ? null 400 | : (_) { 401 | springDown(); 402 | if (onTapDown != null && isEnabled) onTapDown(_); 403 | }, 404 | onTapUp: !hasTap 405 | ? null 406 | : (_) { 407 | spring(); 408 | if (onTapUp != null && isEnabled) onTapUp(_); 409 | }, 410 | onTap: !hasTap 411 | ? null 412 | : () { 413 | if (onTap != null && isEnabled) onTap(); 414 | }, 415 | onTapCancel: !hasTap 416 | ? null 417 | : () { 418 | springUp(); 419 | if (onTapCancel != null && isEnabled) onTapCancel(); 420 | }, 421 | onSecondaryTapDown: !hasSecondaryTap 422 | ? null 423 | : (_) { 424 | springDown(); 425 | if (onSecondaryTapDown != null && isEnabled) 426 | onSecondaryTapDown(_); 427 | }, 428 | onSecondaryTapUp: !hasSecondaryTap 429 | ? null 430 | : (_) { 431 | spring(); 432 | if (onSecondaryTapUp != null && isEnabled) onSecondaryTapUp(_); 433 | }, 434 | onSecondaryTapCancel: !hasSecondaryTap 435 | ? null 436 | : () { 437 | springUp(); 438 | if (onSecondaryTapCancel != null && isEnabled) 439 | onSecondaryTapCancel(); 440 | }, 441 | onDoubleTap: !hasDoubleTap 442 | ? null 443 | : () { 444 | springDown(); 445 | spring(); 446 | if (onDoubleTap != null && isEnabled) onDoubleTap(); 447 | }, 448 | onLongPress: !hasLongPress 449 | ? null 450 | : () { 451 | if (onLongPress != null && isEnabled) onLongPress(); 452 | }, 453 | onLongPressStart: !hasLongPress 454 | ? null 455 | : (_) { 456 | springDown(); 457 | if (onLongPressStart != null && isEnabled) onLongPressStart(_); 458 | }, 459 | onLongPressMoveUpdate: !hasLongPress 460 | ? null 461 | : (_) { 462 | if (onLongPressMoveUpdate != null && isEnabled) 463 | onLongPressMoveUpdate(_); 464 | }, 465 | onLongPressUp: !hasLongPress 466 | ? null 467 | : () { 468 | spring(); 469 | if (onLongPressUp != null && isEnabled) onLongPressUp(); 470 | }, 471 | onLongPressEnd: !hasLongPress 472 | ? null 473 | : (_) { 474 | if (onLongPressEnd != null && isEnabled) onLongPressEnd(_); 475 | }, 476 | onVerticalDragDown: !hasVerticalDrag 477 | ? null 478 | : (_) { 479 | if (onVerticalDragDown != null && isEnabled) 480 | onVerticalDragDown(_); 481 | }, 482 | onVerticalDragStart: !hasVerticalDrag 483 | ? null 484 | : (_) { 485 | springDown(); 486 | if (onVerticalDragStart != null && isEnabled) 487 | onVerticalDragStart(_); 488 | }, 489 | onVerticalDragUpdate: !hasVerticalDrag 490 | ? null 491 | : (_) { 492 | if (onVerticalDragUpdate != null && isEnabled) 493 | onVerticalDragUpdate(_); 494 | }, 495 | onVerticalDragEnd: !hasVerticalDrag 496 | ? null 497 | : (_) { 498 | spring(); 499 | if (onVerticalDragEnd != null && isEnabled) onVerticalDragEnd(_); 500 | }, 501 | onVerticalDragCancel: !hasVerticalDrag 502 | ? null 503 | : () { 504 | springUp(); 505 | if (onVerticalDragCancel != null && isEnabled) 506 | onVerticalDragCancel(); 507 | }, 508 | onHorizontalDragDown: !hasHorizontalDrag 509 | ? null 510 | : (_) { 511 | if (onHorizontalDragDown != null && isEnabled) 512 | onHorizontalDragDown(_); 513 | }, 514 | onHorizontalDragStart: !hasHorizontalDrag 515 | ? null 516 | : (_) { 517 | springDown(); 518 | if (onHorizontalDragStart != null && isEnabled) 519 | onHorizontalDragStart(_); 520 | }, 521 | onHorizontalDragUpdate: !hasHorizontalDrag 522 | ? null 523 | : (_) { 524 | if (onHorizontalDragUpdate != null && isEnabled) 525 | onHorizontalDragUpdate(_); 526 | }, 527 | onHorizontalDragEnd: !hasHorizontalDrag 528 | ? null 529 | : (_) { 530 | spring(); 531 | if (onHorizontalDragEnd != null && isEnabled) 532 | onHorizontalDragEnd(_); 533 | }, 534 | onHorizontalDragCancel: !hasHorizontalDrag 535 | ? null 536 | : () { 537 | springUp(); 538 | if (onHorizontalDragCancel != null && isEnabled) 539 | onHorizontalDragCancel(); 540 | }, 541 | onForcePressStart: !hasForcePress 542 | ? null 543 | : (_) { 544 | springDown(); 545 | if (onForcePressStart != null && isEnabled) onForcePressStart(_); 546 | }, 547 | onForcePressPeak: !hasForcePress 548 | ? null 549 | : (_) { 550 | if (onForcePressPeak != null && isEnabled) onForcePressPeak(_); 551 | }, 552 | onForcePressUpdate: !hasForcePress 553 | ? null 554 | : (_) { 555 | if (onForcePressUpdate != null && isEnabled) 556 | onForcePressUpdate(_); 557 | }, 558 | onForcePressEnd: !hasForcePress 559 | ? null 560 | : (_) { 561 | spring(); 562 | if (onForcePressEnd != null && isEnabled) onForcePressEnd(_); 563 | }, 564 | onPanDown: !hasPan 565 | ? null 566 | : (_) { 567 | if (onPanDown != null && isEnabled) onPanDown(_); 568 | }, 569 | onPanStart: !hasPan 570 | ? null 571 | : (_) { 572 | springDown(); 573 | if (onPanStart != null && isEnabled) onPanStart(_); 574 | }, 575 | onPanUpdate: !hasPan 576 | ? null 577 | : (_) { 578 | if (onPanUpdate != null && isEnabled) onPanUpdate(_); 579 | }, 580 | onPanEnd: !hasPan 581 | ? null 582 | : (_) { 583 | spring(); 584 | if (onPanEnd != null && isEnabled) onPanEnd(_); 585 | }, 586 | onPanCancel: !hasPan 587 | ? null 588 | : () { 589 | springUp(); 590 | if (onPanCancel != null && isEnabled) onPanCancel(); 591 | }, 592 | onScaleStart: !hasScale 593 | ? null 594 | : (_) { 595 | springDown(); 596 | if (onScaleStart != null && isEnabled) onScaleStart(_); 597 | }, 598 | onScaleUpdate: !hasScale 599 | ? null 600 | : (_) { 601 | if (onScaleUpdate != null && isEnabled) onScaleUpdate(_); 602 | }, 603 | onScaleEnd: !hasScale 604 | ? null 605 | : (_) { 606 | spring(); 607 | if (onScaleEnd != null && isEnabled) onScaleEnd(_); 608 | }, 609 | child: widget?.child ?? Container(), 610 | ); 611 | } 612 | 613 | @override 614 | Widget build(BuildContext context) { 615 | if (springButtonType == SpringButtonType.WithOpacity) 616 | return AnimatedBuilder( 617 | animation: animation, 618 | child: useCache ? child : null, 619 | builder: (BuildContext context, Widget cachedChild) { 620 | return Opacity( 621 | opacity: animation.value.clamp(0.5, 1.0), 622 | child: Transform.scale( 623 | scale: animation.value, 624 | alignment: alignment, 625 | child: useCache ? cachedChild : wrapper(), 626 | ), 627 | ); 628 | }, 629 | ); 630 | return AnimatedBuilder( 631 | animation: animation, 632 | child: useCache ? child : null, 633 | builder: (BuildContext context, Widget cachedChild) { 634 | return Transform.scale( 635 | scale: animation.value, 636 | child: useCache ? cachedChild : wrapper(), 637 | ); 638 | }, 639 | ); 640 | } 641 | } 642 | -------------------------------------------------------------------------------- /lib/utils/theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | 4 | const Color primary = Color(0XFF2C54D8); 5 | 6 | const Color accent = Color(0xFF1373FC); 7 | 8 | const Color alt = Color(0xffE4B36B); 9 | 10 | const Color textColor = Color(0xFF0F1950); 11 | 12 | const Color bgColor = Color(0xFF201F1F); 13 | 14 | const Color darkGrey = Color(0xff292525); 15 | 16 | const Color red = Color(0xFFD82C68); 17 | 18 | const Color iconColor = Color(0xFF010F48); 19 | 20 | const Color white = Colors.white; 21 | 22 | const Color black = Colors.black; 23 | 24 | const Color grey = Colors.grey; 25 | 26 | themeData(context) => ThemeData( 27 | textTheme: GoogleFonts.latoTextTheme(Theme.of(context).textTheme), 28 | primarySwatch: Colors.blue, 29 | primaryColor: Colors.blue, 30 | brightness: Brightness.light, 31 | visualDensity: VisualDensity.adaptivePlatformDensity, 32 | ); 33 | 34 | darkThemeData(context) => ThemeData.dark().copyWith( 35 | textTheme: GoogleFonts.latoTextTheme(Theme.of(context).textTheme), 36 | primaryColor: Colors.blue, 37 | visualDensity: VisualDensity.adaptivePlatformDensity, 38 | ); 39 | -------------------------------------------------------------------------------- /lib/views/board.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_feather_icons/flutter_feather_icons.dart'; 5 | import 'package:google_fonts/google_fonts.dart'; 6 | import 'package:musicapp/models/people.dart'; 7 | import 'package:musicapp/utils/fa_progress.dart'; 8 | import 'package:musicapp/utils/margin.dart'; 9 | import 'package:musicapp/utils/theme.dart'; 10 | 11 | class BoardSection extends StatefulWidget { 12 | @override 13 | _BoardSectionState createState() => _BoardSectionState(); 14 | } 15 | 16 | class _BoardSectionState extends State { 17 | List people1; 18 | List people2; 19 | var people = [ 20 | People( 21 | name: 'Greta Abbott', 22 | job: 'Cloud Engineer', 23 | lang: ['AWS', 'Cloudinary', 'Engineer']), 24 | People( 25 | name: 'Lou Stanton', 26 | job: 'Senior Cloud Engineer', 27 | m: true, 28 | lang: ['Java', 'Swift', 'Developer']), 29 | People( 30 | name: 'Kellie Brekke', 31 | job: 'Cloud Team Lead', 32 | lang: ['AWS', 'Engineer', 'Azure']), 33 | People( 34 | name: 'Arnold Bergstrom', 35 | job: 'Junior Cloud Engineer', 36 | m: true, 37 | lang: ['AWS', 'Azure', 'Cloud']), 38 | People( 39 | name: 'John Doe', 40 | job: 'Senior Cloud Engineer', 41 | m: true, 42 | lang: ['Azure', 'AWS', 'GCP']), 43 | People( 44 | name: 'Kyra Lang', 45 | job: 'Cloud Team Lead', 46 | lang: ['Engineer', 'GCP', 'Azure']), 47 | ]; 48 | @override 49 | void initState() { 50 | setState(() { 51 | people.shuffle(); 52 | people1 = people.sublist(0, 3); 53 | people.shuffle(); 54 | people2 = people.sublist(0, 2); 55 | }); 56 | super.initState(); 57 | } 58 | 59 | @override 60 | Widget build(BuildContext context) { 61 | return Column( 62 | children: [ 63 | const YMargin(40), 64 | Row( 65 | children: [ 66 | const XMargin(30), 67 | Text( 68 | 'Cloud Engineering', 69 | style: TextStyle( 70 | fontWeight: FontWeight.w800, 71 | fontSize: 18, 72 | ), 73 | ), 74 | ], 75 | ), 76 | const YMargin(10), 77 | Row( 78 | children: [ 79 | const XMargin(30), 80 | Text( 81 | 'Your musicapp', 82 | style: TextStyle( 83 | fontWeight: FontWeight.w800, 84 | color: darkGrey.withOpacity(0.3), 85 | fontSize: 13, 86 | ), 87 | ), 88 | ], 89 | ), 90 | const YMargin(26), 91 | Flexible( 92 | flex: 0, 93 | child: Container( 94 | height: 0.8, 95 | color: grey.withOpacity(.2), 96 | ), 97 | ), 98 | Expanded( 99 | child: Row( 100 | children: [ 101 | BoardItem( 102 | list: people, 103 | color: Color(0xff7387eb), 104 | icon: FeatherIcons.star, 105 | title: 'New', 106 | ), 107 | BoardItem( 108 | list: people1, 109 | color: Color(0xfffe7e22), 110 | icon: FeatherIcons.checkSquare, 111 | title: 'Shortlisted', 112 | ), 113 | BoardItem( 114 | list: people2, 115 | color: Color(0xff48d0d0), 116 | icon: FeatherIcons.userCheck, 117 | title: 'Approved', 118 | ), 119 | ], 120 | ), 121 | ), 122 | ], 123 | ); 124 | } 125 | } 126 | 127 | class BoardItem extends StatefulWidget { 128 | const BoardItem({ 129 | Key key, 130 | @required this.list, 131 | @required this.color, 132 | @required this.title, 133 | @required this.icon, 134 | }) : super(key: key); 135 | 136 | final List list; 137 | final Color color; 138 | final String title; 139 | final IconData icon; 140 | 141 | @override 142 | _BoardItemState createState() => _BoardItemState(this.list); 143 | } 144 | 145 | class _BoardItemState extends State { 146 | _BoardItemState(this.list); 147 | List list; 148 | 149 | void _onReorder(int oldIndex, int newIndex) { 150 | setState( 151 | () { 152 | if (newIndex > oldIndex) { 153 | newIndex -= 1; 154 | } 155 | final People item = list.removeAt(oldIndex); 156 | list.insert(newIndex, item); 157 | }, 158 | ); 159 | } 160 | 161 | @override 162 | Widget build(BuildContext context) { 163 | return Column( 164 | crossAxisAlignment: CrossAxisAlignment.center, 165 | children: [ 166 | Spacer(), 167 | Container( 168 | height: 40, 169 | margin: EdgeInsets.only(left: 30), 170 | width: context.screenWidth(.2), 171 | child: FAProgressBar( 172 | direction: Axis.horizontal, 173 | currentValue: 45.nextMax(100).floor(), 174 | displayWidget: Row( 175 | children: [ 176 | const XMargin(10), 177 | Icon( 178 | widget.icon, 179 | color: white, 180 | size: 17, 181 | ), 182 | const XMargin(10), 183 | Text( 184 | widget?.title ?? '', 185 | textAlign: TextAlign.start, 186 | style: GoogleFonts.lato( 187 | textStyle: TextStyle( 188 | color: white, 189 | fontWeight: FontWeight.w600, 190 | fontSize: 11)), 191 | ) 192 | ], 193 | ), 194 | progressColor: widget.color, 195 | backgroundColor: widget.color.withOpacity(0.2), 196 | ), 197 | ), 198 | Row( 199 | // scrollDirection: Axis.horizontal, 200 | children: [ 201 | Container( 202 | height: context.screenHeight(.75), 203 | width: context.screenWidth(.2), 204 | margin: EdgeInsets.fromLTRB(30, 30, 0, 0), 205 | decoration: BoxDecoration( 206 | color: Color(0xfff0f2f5), 207 | borderRadius: BorderRadius.only( 208 | topLeft: Radius.circular(10), 209 | topRight: Radius.circular(10), 210 | ), 211 | ), 212 | child: ReorderableListView( 213 | onReorder: _onReorder, 214 | scrollController: ScrollController(), 215 | // buildDraggableFeedback: (a, b, c) => Container(), 216 | children: List.generate( 217 | widget.list.length, 218 | (index) { 219 | return ListViewCard( 220 | widget.list[index], 221 | index, 222 | Key('$index'), 223 | ); 224 | }, 225 | ), 226 | ), 227 | ), 228 | ], 229 | ), 230 | ], 231 | ); 232 | } 233 | } 234 | 235 | class ListViewCard extends StatefulWidget { 236 | final int index; 237 | final Key key; 238 | final People person; 239 | 240 | ListViewCard(this.person, this.index, this.key); 241 | 242 | @override 243 | _ListViewCard createState() => _ListViewCard(); 244 | } 245 | 246 | class _ListViewCard extends State { 247 | @override 248 | Widget build(BuildContext context) { 249 | return Container( 250 | margin: EdgeInsets.fromLTRB(15, 18, 15, 0), 251 | padding: EdgeInsets.all(16), 252 | width: context.screenWidth(.3), 253 | decoration: BoxDecoration( 254 | color: white, 255 | borderRadius: BorderRadius.circular(9), 256 | boxShadow: [ 257 | BoxShadow( 258 | color: Colors.grey.withOpacity(.2), 259 | blurRadius: 10, 260 | ) 261 | ]), 262 | child: Column( 263 | mainAxisSize: MainAxisSize.min, 264 | crossAxisAlignment: CrossAxisAlignment.start, 265 | children: [ 266 | Row( 267 | crossAxisAlignment: CrossAxisAlignment.start, 268 | children: [ 269 | Container( 270 | width: context.screenWidth(.03), 271 | height: context.screenWidth(.03), 272 | decoration: BoxDecoration( 273 | color: Colors.blueGrey[200], 274 | borderRadius: BorderRadius.circular(100), 275 | image: DecorationImage( 276 | fit: BoxFit.cover, 277 | image: NetworkImage( 278 | 'https://randomuser.me/api/portraits/${widget.person.m ? 'men' : 'women'}/${widget.index}.jpg'))), 279 | ), 280 | Container( 281 | padding: const EdgeInsets.only(left: 10, right: 9), 282 | child: Column( 283 | crossAxisAlignment: CrossAxisAlignment.start, 284 | mainAxisAlignment: MainAxisAlignment.start, 285 | children: [ 286 | Container( 287 | width: context.screenWidth(.082), 288 | child: Text( 289 | widget?.person?.name ?? '', 290 | textAlign: TextAlign.start, 291 | style: GoogleFonts.lato( 292 | textStyle: TextStyle( 293 | fontWeight: FontWeight.w600, fontSize: 12)), 294 | ), 295 | ), 296 | const YMargin(5), 297 | Container( 298 | width: context.screenWidth(.06), 299 | child: Text(widget?.person?.job ?? '', 300 | textAlign: TextAlign.start, 301 | style: TextStyle( 302 | fontWeight: FontWeight.w300, 303 | fontSize: 10, 304 | color: Colors.grey[400], 305 | )), 306 | ), 307 | ], 308 | ), 309 | ), 310 | ], 311 | ), 312 | const YMargin(15), 313 | Container( 314 | height: 20, 315 | width: 200, 316 | child: ListView( 317 | padding: EdgeInsets.all(0), 318 | scrollDirection: Axis.horizontal, 319 | children: [ 320 | for (var min in widget?.person?.lang ?? []) 321 | Container( 322 | padding: EdgeInsets.symmetric(horizontal: 6, vertical: 1), 323 | margin: EdgeInsets.only(right: 6), 324 | decoration: BoxDecoration( 325 | border: Border.all(color: Colors.grey[300]), 326 | borderRadius: BorderRadius.circular(20)), 327 | child: Center( 328 | child: Text(min ?? '', 329 | style: TextStyle( 330 | fontWeight: FontWeight.w300, 331 | fontSize: 10, 332 | color: Colors.grey[400], 333 | )), 334 | ), 335 | ), 336 | ], 337 | ), 338 | ), 339 | ], 340 | ), 341 | ); 342 | } 343 | } 344 | 345 | extension Num on num { 346 | double nextMax(num max) { 347 | return this + (max - this) * Random().nextDouble(); 348 | } 349 | } 350 | -------------------------------------------------------------------------------- /lib/views/home.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:musicapp/utils/theme.dart'; 4 | import 'package:musicapp/utils/margin.dart'; 5 | 6 | import 'menu.dart'; 7 | 8 | class MyHomePage extends StatefulWidget { 9 | @override 10 | _MyHomePageState createState() => _MyHomePageState(); 11 | } 12 | 13 | class _MyHomePageState extends State { 14 | final GlobalKey _scaffoldkey = new GlobalKey(); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Scaffold( 19 | backgroundColor: Colors.white, 20 | key: _scaffoldkey, 21 | drawer: Drawer(), 22 | body: Container( 23 | color: Color(0xffF8F8F8), 24 | child: Stack( 25 | children: [ 26 | Row( 27 | children: [ 28 | Flexible( 29 | flex: 2, 30 | child: MenuSection(), 31 | ), 32 | Flexible( 33 | flex: 10, 34 | child: Container( 35 | child: Column( 36 | children: [ 37 | const YMargin(90), 38 | Flexible(child: HomeSection()) 39 | ], 40 | ), 41 | ), 42 | ), 43 | Flexible( 44 | flex: 3, 45 | child: Column( 46 | children: [ 47 | const YMargin(90), 48 | Flexible( 49 | child: Player(), 50 | ), 51 | ], 52 | ), 53 | ), 54 | ], 55 | ), 56 | Padding( 57 | padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 40), 58 | child: Row( 59 | children: [ 60 | Container( 61 | height: context.screenHeight(.05), 62 | width: context.screenWidth(.12), 63 | child: ClipRRect( 64 | borderRadius: BorderRadius.circular(6), 65 | child: FlatButton( 66 | color: accent, 67 | padding: EdgeInsets.all(0), 68 | onPressed: () {}, 69 | child: Row( 70 | children: [ 71 | const XMargin(10), 72 | Text( 73 | 'Create Playlist', 74 | style: GoogleFonts.lato( 75 | textStyle: TextStyle( 76 | color: white, 77 | fontWeight: FontWeight.bold, 78 | fontSize: 12), 79 | ), 80 | ), 81 | Spacer(), 82 | Container( 83 | color: Color(0xff2680FC), 84 | height: context.screenHeight(.05), 85 | width: context.screenWidth(.034), 86 | child: Icon( 87 | Icons.playlist_add, 88 | color: white, 89 | size: 15, 90 | ), 91 | ) 92 | ], 93 | )), 94 | ), 95 | ), 96 | const XMargin(35), 97 | Text( 98 | 'Featured Tracks', 99 | style: GoogleFonts.lato( 100 | textStyle: TextStyle( 101 | color: iconColor, 102 | fontWeight: FontWeight.bold, 103 | fontSize: 15), 104 | ), 105 | ), 106 | const XMargin(35), 107 | Text( 108 | 'Charts', 109 | style: GoogleFonts.lato( 110 | textStyle: TextStyle( 111 | color: iconColor, 112 | fontWeight: FontWeight.bold, 113 | fontSize: 15), 114 | ), 115 | ), 116 | const XMargin(35), 117 | Text( 118 | 'Videos', 119 | style: GoogleFonts.lato( 120 | textStyle: TextStyle( 121 | color: iconColor, 122 | fontWeight: FontWeight.bold, 123 | fontSize: 15), 124 | ), 125 | ), 126 | ], 127 | ), 128 | ) 129 | ], 130 | ), 131 | ), 132 | ); 133 | } 134 | } 135 | 136 | class Player extends StatelessWidget { 137 | const Player({ 138 | Key key, 139 | }) : super(key: key); 140 | 141 | @override 142 | Widget build(BuildContext context) { 143 | return Container( 144 | margin: EdgeInsets.only(top: 10), 145 | decoration: BoxDecoration( 146 | border: Border( 147 | top: BorderSide( 148 | color: Color(0xffECECF4), 149 | ), 150 | ), 151 | ), 152 | child: Center( 153 | child: Container( 154 | child: Column( 155 | children: [ 156 | const YMargin(50), 157 | Stack( 158 | children: [ 159 | Align( 160 | alignment: Alignment.center, 161 | child: Container( 162 | height: context.screenWidth(.11), 163 | width: context.screenWidth(.11), 164 | child: CircularProgressIndicator( 165 | value: 0.8, 166 | strokeWidth: 2.5, 167 | backgroundColor: Color(0xFFEBEBF3), 168 | valueColor: AlwaysStoppedAnimation(Color(0xFF1269FB)), 169 | ), 170 | ), 171 | ), 172 | Center( 173 | child: Column( 174 | children: [ 175 | Padding( 176 | padding: const EdgeInsets.only(top: 20), 177 | child: Container( 178 | height: context.screenWidth(.08), 179 | width: context.screenWidth(.08), 180 | decoration: BoxDecoration( 181 | boxShadow: [ 182 | BoxShadow( 183 | color: Colors.grey.withOpacity(0.8), 184 | blurRadius: 18, 185 | offset: Offset(0, 18)) 186 | ], 187 | color: Colors.blueGrey[200], 188 | borderRadius: BorderRadius.circular(100), 189 | image: DecorationImage( 190 | fit: BoxFit.cover, 191 | image: AssetImage('assets/images/11.png'))), 192 | ), 193 | ), 194 | const YMargin(40), 195 | Text('Heartless', 196 | style: GoogleFonts.lato( 197 | textStyle: TextStyle( 198 | color: iconColor, 199 | fontWeight: FontWeight.bold, 200 | fontSize: 15))), 201 | const YMargin(5), 202 | Text( 203 | 'The Weeknd', 204 | style: GoogleFonts.lato( 205 | textStyle: TextStyle( 206 | color: Color(0xffB7BDCC), 207 | fontWeight: FontWeight.w400, 208 | fontSize: 11), 209 | ), 210 | ), 211 | const YMargin(25), 212 | Row( 213 | mainAxisAlignment: MainAxisAlignment.center, 214 | children: [ 215 | Icon(Icons.fast_rewind, size: 14, color: iconColor), 216 | const XMargin(10), 217 | Icon(Icons.pause, size: 14, color: iconColor), 218 | const XMargin(10), 219 | Icon(Icons.fast_forward, 220 | size: 14, color: iconColor), 221 | ], 222 | ) 223 | ], 224 | ), 225 | ), 226 | ], 227 | ) 228 | ], 229 | ), 230 | ), 231 | ), 232 | ); 233 | } 234 | } 235 | 236 | class HomeSection extends StatefulWidget { 237 | const HomeSection({ 238 | Key key, 239 | }) : super(key: key); 240 | 241 | @override 242 | _HomeSectionState createState() => _HomeSectionState(); 243 | } 244 | 245 | class _HomeSectionState extends State { 246 | var list = [ 247 | SongCard( 248 | title: 'hot girl bummer', 249 | img: '1', 250 | sub: 'Pop Music', 251 | ), 252 | SongCard( 253 | title: 'Geng', 254 | img: '10', 255 | sub: 'Afro Pop', 256 | ), 257 | SongCard( 258 | title: 'Sub Urban - Cradles', 259 | img: '2', 260 | sub: 'Alternative', 261 | ), 262 | SongCard( 263 | title: 'Changes', 264 | img: '3', 265 | sub: 'Pop Music', 266 | ), 267 | SongCard( 268 | title: 'Angel', 269 | img: '5', 270 | sub: 'Electronic', 271 | ), 272 | SongCard( 273 | title: 'The Take', 274 | img: '6', 275 | sub: 'RnB / Soul', 276 | ), 277 | ]; 278 | 279 | void _onReorder(int oldIndex, int newIndex) { 280 | setState( 281 | () { 282 | if (newIndex > oldIndex) { 283 | newIndex -= 1; 284 | } 285 | final Widget item = list.removeAt(oldIndex); 286 | list.insert(newIndex, item); 287 | }, 288 | ); 289 | } 290 | 291 | @override 292 | Widget build(BuildContext context) { 293 | return Container( 294 | margin: EdgeInsets.only(top: 10), 295 | decoration: BoxDecoration( 296 | border: Border( 297 | top: BorderSide( 298 | color: Color(0xffECECF4), 299 | ), 300 | right: BorderSide( 301 | color: Color(0xffECECF4), 302 | ), 303 | ), 304 | ), 305 | child: ListView( 306 | children: [ 307 | const YMargin(50), 308 | Container( 309 | height: context.screenHeight(.3), 310 | child: ReorderableListView( 311 | onReorder: _onReorder, 312 | scrollDirection: Axis.horizontal, 313 | padding: EdgeInsets.only(left: 40), 314 | scrollController: ScrollController(), 315 | // buildDraggableFeedback: (a, b, c) => Container(), 316 | children: List.generate( 317 | list.length, 318 | (index) { 319 | return Container( 320 | child: list[index], 321 | key: Key('$index'), 322 | ); 323 | }, 324 | ), 325 | ), 326 | ), 327 | Padding( 328 | padding: const EdgeInsets.all(30), 329 | child: Row( 330 | crossAxisAlignment: CrossAxisAlignment.start, 331 | children: [ 332 | Flexible( 333 | flex: 4, 334 | child: Tracks(), 335 | ), 336 | const XMargin(30), 337 | Flexible( 338 | flex: 2, 339 | child: Column( 340 | crossAxisAlignment: CrossAxisAlignment.start, 341 | children: [ 342 | Text('Listening History', 343 | style: GoogleFonts.lato( 344 | textStyle: TextStyle( 345 | color: iconColor, 346 | fontWeight: FontWeight.bold, 347 | fontSize: 16))), 348 | const YMargin(25), 349 | Container( 350 | height: context.screenHeight(.314), 351 | decoration: BoxDecoration( 352 | color: white, 353 | borderRadius: BorderRadius.circular(5), 354 | boxShadow: [ 355 | BoxShadow( 356 | color: Colors.grey.withOpacity(0.5), 357 | blurRadius: 10, 358 | spreadRadius: -11, 359 | ) 360 | ], 361 | ), 362 | padding: EdgeInsets.fromLTRB(15, 14, 15, 0), 363 | child: Column( 364 | mainAxisAlignment: MainAxisAlignment.center, 365 | children: [ 366 | ListenItem( 367 | img: '1', 368 | title: 'hot girl bummer', 369 | sub: 'blackbear', 370 | ), 371 | Spacer(), 372 | ListenItem( 373 | img: '8', 374 | title: 'Tusa', 375 | sub: 'Karol G & Nicki Minaj', 376 | ), 377 | Spacer(), 378 | ListenItem( 379 | img: '9', 380 | title: 'Falling', 381 | sub: 'Trevor Daniel', 382 | ), 383 | Spacer(), 384 | ListenItem( 385 | img: '2', 386 | title: 'Cradles', 387 | sub: 'Sub Urban', 388 | ), 389 | ], 390 | ), 391 | ), 392 | ], 393 | ), 394 | ), 395 | ], 396 | ), 397 | ) 398 | ], 399 | ), 400 | ); 401 | } 402 | } 403 | 404 | class ListenItem extends StatelessWidget { 405 | final String img, title, sub; 406 | 407 | const ListenItem( 408 | {Key key, @required this.img, @required this.title, @required this.sub}) 409 | : super(key: key); 410 | @override 411 | Widget build(BuildContext context) { 412 | return Padding( 413 | padding: const EdgeInsets.only(bottom: 15), 414 | child: Row( 415 | children: [ 416 | Container( 417 | height: context.screenHeight(.045), 418 | width: context.screenHeight(.045), 419 | decoration: BoxDecoration( 420 | borderRadius: BorderRadius.circular(5), 421 | image: DecorationImage( 422 | fit: BoxFit.cover, 423 | image: AssetImage('assets/images/$img.png'))), 424 | ), 425 | const XMargin(25), 426 | Column( 427 | crossAxisAlignment: CrossAxisAlignment.start, 428 | children: [ 429 | Text(title ?? '', 430 | style: GoogleFonts.lato( 431 | textStyle: TextStyle( 432 | color: iconColor, 433 | fontWeight: FontWeight.bold, 434 | fontSize: 13))), 435 | const YMargin(4), 436 | Text( 437 | sub ?? '', 438 | style: GoogleFonts.lato( 439 | textStyle: TextStyle( 440 | color: Color(0xffB7BDCC), 441 | fontWeight: FontWeight.w400, 442 | fontSize: 11)), 443 | ), 444 | ], 445 | ), 446 | Spacer(), 447 | Play(), 448 | ], 449 | ), 450 | ); 451 | } 452 | } 453 | 454 | class Tracks extends StatelessWidget { 455 | const Tracks({ 456 | Key key, 457 | }) : super(key: key); 458 | 459 | @override 460 | Widget build(BuildContext context) { 461 | return Column( 462 | crossAxisAlignment: CrossAxisAlignment.start, 463 | children: [ 464 | Padding( 465 | padding: const EdgeInsets.only(left: 30), 466 | child: Text('Tracks for You', 467 | style: GoogleFonts.lato( 468 | textStyle: TextStyle( 469 | color: iconColor, 470 | fontWeight: FontWeight.bold, 471 | fontSize: 16))), 472 | ), 473 | const YMargin(25), 474 | TrackItem( 475 | title: 'Tusa', 476 | img: '7', 477 | artiste: 'Karol G', 478 | time: '3:21', 479 | ), 480 | TrackItem( 481 | title: 'No Idea', 482 | img: '8', 483 | artiste: 'Don Toliver', 484 | time: '3:21', 485 | ), 486 | TrackItem( 487 | title: 'The Take', 488 | img: '6', 489 | artiste: 'Tory Lanez', 490 | time: '3:41', 491 | ), 492 | TrackItem( 493 | title: 'Suzanna', 494 | img: '4', 495 | artiste: 'Sauti Soul', 496 | time: '3:51', 497 | ), 498 | ], 499 | ); 500 | } 501 | } 502 | 503 | class TrackItem extends StatelessWidget { 504 | final String img, title, artiste, time; 505 | 506 | const TrackItem({ 507 | Key key, 508 | @required this.img, 509 | @required this.title, 510 | @required this.artiste, 511 | @required this.time, 512 | }); 513 | @override 514 | Widget build(BuildContext context) { 515 | return Container( 516 | height: 55, 517 | margin: EdgeInsets.only(bottom: 10), 518 | decoration: BoxDecoration( 519 | color: white, 520 | borderRadius: BorderRadius.circular(5), 521 | boxShadow: [ 522 | BoxShadow( 523 | color: Colors.grey.withOpacity(0.4), 524 | blurRadius: 10, 525 | spreadRadius: -11, 526 | ) 527 | ], 528 | ), 529 | child: Row( 530 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 531 | children: [ 532 | const XMargin(20), 533 | Container( 534 | height: 30, 535 | width: 30, 536 | decoration: BoxDecoration( 537 | boxShadow: [ 538 | BoxShadow( 539 | color: Colors.grey.withOpacity(0.7), 540 | blurRadius: 18, 541 | offset: Offset(0, 8)) 542 | ], 543 | color: Colors.blueGrey[200], 544 | borderRadius: BorderRadius.circular(100), 545 | image: DecorationImage( 546 | fit: BoxFit.cover, 547 | image: AssetImage('assets/images/$img.png'))), 548 | ), 549 | const XMargin(25), 550 | Container( 551 | width: context.screenWidth(.04), 552 | child: Text( 553 | title ?? '', 554 | style: GoogleFonts.lato( 555 | textStyle: TextStyle( 556 | color: iconColor, 557 | fontWeight: FontWeight.bold, 558 | fontSize: 13)), 559 | ), 560 | ), 561 | Spacer(), 562 | Container( 563 | width: context.screenWidth(.06), 564 | child: Text( 565 | artiste ?? '', 566 | style: GoogleFonts.lato( 567 | textStyle: TextStyle( 568 | color: iconColor, 569 | fontWeight: FontWeight.bold, 570 | fontSize: 13)), 571 | ), 572 | ), 573 | Spacer(), 574 | Text( 575 | time ?? '', 576 | textAlign: TextAlign.center, 577 | style: GoogleFonts.lato( 578 | textStyle: TextStyle( 579 | color: accent, fontWeight: FontWeight.w400, fontSize: 13)), 580 | ), 581 | Spacer(), 582 | Play(), 583 | const XMargin(20), 584 | ], 585 | ), 586 | ); 587 | } 588 | } 589 | 590 | class Play extends StatelessWidget { 591 | const Play({ 592 | Key key, 593 | }) : super(key: key); 594 | 595 | @override 596 | Widget build(BuildContext context) { 597 | return Container( 598 | height: 25, 599 | width: 25, 600 | decoration: BoxDecoration( 601 | color: accent, 602 | borderRadius: BorderRadius.circular(100), 603 | ), 604 | child: Icon( 605 | Icons.play_arrow, 606 | color: white, 607 | size: 15, 608 | ), 609 | ); 610 | } 611 | } 612 | 613 | class SongCard extends StatelessWidget { 614 | final String img, title, sub; 615 | 616 | const SongCard( 617 | {Key key, @required this.img, @required this.title, @required this.sub}); 618 | @override 619 | Widget build(BuildContext context) { 620 | return Padding( 621 | padding: const EdgeInsets.only(right: 45), 622 | child: Column( 623 | crossAxisAlignment: CrossAxisAlignment.start, 624 | children: [ 625 | Container( 626 | height: context.screenHeight(.17), 627 | width: context.screenHeight(.17), 628 | decoration: BoxDecoration( 629 | borderRadius: BorderRadius.circular(5), 630 | boxShadow: [ 631 | BoxShadow( 632 | color: Colors.grey.withOpacity(0.5), 633 | blurRadius: 26, 634 | spreadRadius: -11, 635 | offset: Offset(0, 20), 636 | ) 637 | ], 638 | image: DecorationImage( 639 | fit: BoxFit.cover, 640 | image: AssetImage('assets/images/$img.png'))), 641 | ), 642 | const YMargin(20), 643 | Text(title ?? '', 644 | style: GoogleFonts.lato( 645 | textStyle: TextStyle( 646 | color: iconColor, 647 | fontWeight: FontWeight.bold, 648 | fontSize: 12))), 649 | const YMargin(4), 650 | Text( 651 | sub ?? '', 652 | style: GoogleFonts.lato( 653 | textStyle: TextStyle( 654 | color: Color(0xffB7BDCC), 655 | fontWeight: FontWeight.w400, 656 | fontSize: 11)), 657 | ), 658 | ], 659 | ), 660 | ); 661 | } 662 | } 663 | -------------------------------------------------------------------------------- /lib/views/menu.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_feather_icons/flutter_feather_icons.dart'; 3 | import 'package:google_fonts/google_fonts.dart'; 4 | import 'package:line_icons/line_icons.dart'; 5 | import 'package:musicapp/utils/margin.dart'; 6 | import 'package:musicapp/utils/theme.dart'; 7 | 8 | class MenuSection extends StatelessWidget { 9 | @override 10 | Widget build(BuildContext context) { 11 | return Material( 12 | color: Color(0XFFF3F3F3), 13 | child: ListView( 14 | padding: EdgeInsets.symmetric(horizontal: 40), 15 | children: [ 16 | const YMargin(100), 17 | MenuItem( 18 | icon: LineIcons.compass, 19 | title: 'Explore', 20 | ), 21 | MenuItem( 22 | icon: FeatherIcons.radio, 23 | title: 'Stations', 24 | ), 25 | MenuItem( 26 | icon: FeatherIcons.inbox, 27 | title: 'Inbox', 28 | ), 29 | MenuItem( 30 | icon: FeatherIcons.mic, 31 | title: 'Artist', 32 | ), 33 | MenuItem( 34 | icon: FeatherIcons.disc, 35 | title: 'Albums', 36 | ), 37 | MenuItem( 38 | icon: FeatherIcons.settings, 39 | title: 'Settings', 40 | ), 41 | const YMargin(50), 42 | Text( 43 | 'Your Playlists', 44 | style: GoogleFonts.lato( 45 | textStyle: TextStyle( 46 | color: Color(0xffB7BDCC), 47 | fontWeight: FontWeight.w500, 48 | fontSize: 14)), 49 | ), 50 | const YMargin(30), 51 | Text( 52 | 'Old Days', 53 | style: GoogleFonts.lato( 54 | textStyle: TextStyle( 55 | color: iconColor, 56 | fontWeight: FontWeight.w400, 57 | fontSize: 13)), 58 | ), 59 | const YMargin(20), 60 | Text( 61 | 'Honeymoon', 62 | style: GoogleFonts.lato( 63 | textStyle: TextStyle( 64 | color: iconColor, 65 | fontWeight: FontWeight.w400, 66 | fontSize: 13)), 67 | ), 68 | const YMargin(20), 69 | Text( 70 | 'Master Pieces', 71 | style: GoogleFonts.lato( 72 | textStyle: TextStyle( 73 | color: iconColor, 74 | fontWeight: FontWeight.w400, 75 | fontSize: 13)), 76 | ), 77 | const YMargin(50), 78 | Text( 79 | 'Collections', 80 | style: GoogleFonts.lato( 81 | textStyle: TextStyle( 82 | color: Color(0xffB7BDCC), 83 | fontWeight: FontWeight.w500, 84 | fontSize: 14)), 85 | ), 86 | const YMargin(30), 87 | CollectionItem( 88 | title: 'Animals', 89 | url: null, 90 | ), 91 | const YMargin(20), 92 | CollectionItem( 93 | title: 'Karbon', 94 | url: null, 95 | ), 96 | const YMargin(20), 97 | CollectionItem( 98 | title: 'Saxify', 99 | url: null, 100 | ), 101 | ], 102 | ), 103 | ); 104 | } 105 | } 106 | 107 | class CollectionItem extends StatelessWidget { 108 | final String title, url; 109 | 110 | const CollectionItem({ 111 | Key key, 112 | @required this.title, 113 | @required this.url, 114 | }); 115 | @override 116 | Widget build(BuildContext context) { 117 | return ClipRRect( 118 | borderRadius: BorderRadius.circular(25), 119 | child: Material( 120 | color: Colors.transparent, 121 | child: InkWell( 122 | onTap: () {}, 123 | child: Row( 124 | children: [ 125 | Container( 126 | height: 25, 127 | width: 25, 128 | decoration: BoxDecoration( 129 | color: Colors.blueGrey[200], 130 | borderRadius: BorderRadius.circular(100), 131 | image: DecorationImage( 132 | fit: BoxFit.cover, 133 | image: NetworkImage(url ?? 134 | 'https://pbs.twimg.com/profile_images/1274197880635621376/ZCJygPAs_400x400.jpg'))), 135 | ), 136 | const XMargin(10), 137 | Text( 138 | title ?? '', 139 | style: GoogleFonts.lato( 140 | textStyle: TextStyle( 141 | color: iconColor, 142 | fontWeight: FontWeight.bold, 143 | fontSize: 13)), 144 | ), 145 | ], 146 | ), 147 | ), 148 | ), 149 | ); 150 | } 151 | } 152 | 153 | class MenuItem extends StatelessWidget { 154 | final IconData icon; 155 | final String title; 156 | 157 | const MenuItem({ 158 | Key key, 159 | @required this.icon, 160 | @required this.title, 161 | }) : super(key: key); 162 | 163 | @override 164 | Widget build(BuildContext context) { 165 | return Padding( 166 | padding: const EdgeInsets.only(top: 15), 167 | child: ClipRRect( 168 | borderRadius: BorderRadius.circular(25), 169 | child: Material( 170 | color: Colors.transparent, 171 | child: InkWell( 172 | onTap: () {}, 173 | child: Padding( 174 | padding: const EdgeInsets.all(8.0), 175 | child: Row( 176 | mainAxisSize: MainAxisSize.min, 177 | crossAxisAlignment: CrossAxisAlignment.center, 178 | children: [ 179 | Icon( 180 | icon, 181 | color: iconColor, 182 | size: 14, 183 | ), 184 | const XMargin(10), 185 | Text( 186 | title ?? '', 187 | style: GoogleFonts.lato( 188 | textStyle: TextStyle( 189 | color: iconColor, 190 | fontWeight: FontWeight.bold, 191 | fontSize: 13)), 192 | ) 193 | ], 194 | ), 195 | ), 196 | ), 197 | ), 198 | ), 199 | ); 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /lib/views/netflix.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:musicapp/utils/margin.dart'; 4 | import 'package:musicapp/utils/navigator.dart'; 5 | import 'package:musicapp/utils/theme.dart'; 6 | import 'package:provider/provider.dart'; 7 | 8 | import 'provider/netflix_vm.dart'; 9 | 10 | class Netflix extends StatefulWidget { 11 | final int tag; 12 | Netflix({Key key, this.tag}) : super(key: key); 13 | 14 | @override 15 | _NetflixState createState() => _NetflixState(); 16 | } 17 | 18 | class _NetflixState extends State with TickerProviderStateMixin { 19 | AnimationController animation; 20 | Animation _fadeInFadeOut; 21 | 22 | @override 23 | void initState() { 24 | super.initState(); 25 | animation = AnimationController( 26 | vsync: this, 27 | duration: Duration(seconds: 2), 28 | ); 29 | _fadeInFadeOut = Tween(begin: 0.0, end: 1).animate(animation); 30 | 31 | animation.addStatusListener((status) { 32 | if (status == AnimationStatus.completed) { 33 | // animation.reverse(); 34 | } 35 | }); 36 | animation.forward(); 37 | } 38 | @override 39 | void dispose() { 40 | animation.dispose(); 41 | super.dispose(); 42 | } 43 | @override 44 | Widget build(BuildContext context) { 45 | var prov = context.watch(); 46 | 47 | return Theme( 48 | data: Theme.of(context).copyWith(), 49 | child: GestureDetector( 50 | onDoubleTap: ()async { 51 | await prov.assetsAudioPlayer2.play(); 52 | popView(context); 53 | }, 54 | child: Material( 55 | color: Colors.transparent, 56 | child: Stack( 57 | children: [ 58 | Hero( 59 | tag: '${widget.tag}', 60 | child: Container( 61 | width: double.infinity, 62 | height: double.infinity, 63 | decoration: BoxDecoration( 64 | color: Colors.blueGrey[200], 65 | image: DecorationImage( 66 | fit: BoxFit.cover, 67 | image: ExactAssetImage( 68 | 'assets/images/nfx${widget.tag > 0 ? widget.tag : ''}.png'), 69 | ))), 70 | ), 71 | FadeTransition( 72 | opacity: _fadeInFadeOut, 73 | child: Padding( 74 | padding: EdgeInsets.symmetric(horizontal: 50, vertical: 40), 75 | child: ListView( 76 | children: [ 77 | Row( 78 | crossAxisAlignment: CrossAxisAlignment.start, 79 | children: [ 80 | GestureDetector( 81 | onTap: () async { 82 | prov.assetsAudioPlayer2.stop(); 83 | prov.assetsAudioPlayer2.play(); 84 | popView(context); 85 | }, 86 | child: Image.asset( 87 | 'assets/images/nfx_logo.png', 88 | height: 27, 89 | ), 90 | ), 91 | Spacer(), 92 | Text( 93 | 'About', 94 | style: GoogleFonts.lato( 95 | fontSize: 10, 96 | letterSpacing: 1.1, 97 | color: white.withOpacity(0.9), 98 | fontWeight: FontWeight.w300), 99 | ), 100 | ], 101 | ), 102 | const YMargin(120), 103 | Text( 104 | 'STRANGER', 105 | style: GoogleFonts.lato( 106 | fontSize: 39, 107 | letterSpacing: 3, 108 | color: white, 109 | fontWeight: FontWeight.bold), 110 | ), 111 | const YMargin(5), 112 | Text( 113 | 'THINGS', 114 | style: GoogleFonts.lato( 115 | fontSize: 37, 116 | letterSpacing: 3, 117 | color: white, 118 | fontWeight: FontWeight.w200), 119 | ), 120 | const YMargin(25), 121 | Column( 122 | crossAxisAlignment: CrossAxisAlignment.start, 123 | children: [ 124 | Container( 125 | width: context.screenWidth(0.305), 126 | child: Text( 127 | 'After the mysterious and sudden vanishing of a young boy, the people of a small town begin to uncover secrets of a government lab, portals to another world and sinister monsters.', 128 | style: GoogleFonts.lato( 129 | fontSize: 11, 130 | letterSpacing: 1.3, 131 | height: 2, 132 | color: white, 133 | fontWeight: FontWeight.w200), 134 | ), 135 | ), 136 | const YMargin(60), 137 | Container( 138 | height: 29, 139 | child: OutlineButton( 140 | color: white, 141 | padding: EdgeInsets.symmetric(horizontal: 20), 142 | borderSide: BorderSide( 143 | color: white.withOpacity(0.7), 144 | ), 145 | shape: RoundedRectangleBorder( 146 | borderRadius: BorderRadius.circular(0)), 147 | highlightedBorderColor: Colors.red, 148 | onPressed: () {}, 149 | child: Text( 150 | 'Start Watching', 151 | style: GoogleFonts.lato( 152 | fontSize: 9, 153 | letterSpacing: 1, 154 | color: white, 155 | fontWeight: FontWeight.w300), 156 | ), 157 | ), 158 | ) 159 | ], 160 | ), 161 | YMargin(context.screenWidth(0.11)), 162 | Row( 163 | mainAxisAlignment: MainAxisAlignment.end, 164 | children: [ 165 | Text( 166 | 'Created By ', 167 | style: GoogleFonts.lato( 168 | color: white.withOpacity(0.5), 169 | fontSize: 9, 170 | fontWeight: FontWeight.w300, 171 | ), 172 | ), 173 | Text( 174 | 'The Duffer Brothers', 175 | style: GoogleFonts.lato( 176 | fontSize: 9, 177 | color: white.withOpacity(0.8), 178 | fontWeight: FontWeight.w400), 179 | ), 180 | ], 181 | ) 182 | ], 183 | ), 184 | ), 185 | ), 186 | ], 187 | )), 188 | ), 189 | ); 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /lib/views/netflix_home.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_feather_icons/flutter_feather_icons.dart'; 5 | import 'package:google_fonts/google_fonts.dart'; 6 | import 'package:musicapp/utils/margin.dart'; 7 | import 'package:musicapp/utils/navigator.dart'; 8 | import 'package:musicapp/utils/theme.dart'; 9 | import 'package:musicapp/views/provider/netflix_vm.dart'; 10 | import 'package:provider/provider.dart'; 11 | import 'package:smooth_page_indicator/smooth_page_indicator.dart'; 12 | 13 | import 'netflix.dart'; 14 | 15 | class NetflixHome extends StatefulWidget { 16 | NetflixHome({Key key}) : super(key: key); 17 | 18 | @override 19 | _NetflixHomeState createState() => _NetflixHomeState(); 20 | } 21 | 22 | class _NetflixHomeState extends State { 23 | @override 24 | void initState() { 25 | context.read().init(); 26 | super.initState(); 27 | } 28 | 29 | @override 30 | Widget build(BuildContext context) { 31 | var prov = context.watch(); 32 | return Scaffold( 33 | body: Stack( 34 | children: [ 35 | Container( 36 | decoration: BoxDecoration( 37 | image: DecorationImage( 38 | fit: BoxFit.cover, 39 | image: AssetImage('assets/images/img2.png'), 40 | ), 41 | ), 42 | ), 43 | Row( 44 | children: [ 45 | Flexible( 46 | flex: 7, 47 | child: Container( 48 | child: Padding( 49 | padding: EdgeInsets.all(40), 50 | child: Column( 51 | crossAxisAlignment: CrossAxisAlignment.start, 52 | children: [ 53 | Image.asset( 54 | 'assets/images/nfx_logo.png', 55 | height: 20, 56 | ), 57 | const YMargin(50), 58 | Text( 59 | 'MENU', 60 | style: GoogleFonts.lato( 61 | fontSize: 6, 62 | letterSpacing: 1, 63 | color: white, 64 | fontWeight: FontWeight.w400), 65 | ), 66 | const YMargin(20), 67 | MenuItem('MY', 'LIST'), 68 | MenuItem('RECENT', 'MOVIES'), 69 | MenuItem('TRENDING', 'NOW'), 70 | Spacer(), 71 | Text( 72 | 'LIBRARY', 73 | style: GoogleFonts.lato( 74 | fontSize: 6, 75 | letterSpacing: 1, 76 | color: white, 77 | fontWeight: FontWeight.w400), 78 | ), 79 | const YMargin(20), 80 | MenuItem('NETFLIX', 'ORIGINALS'), 81 | MenuItem('US', 'TV SHOWS'), 82 | MenuItem('TO 10', 'NIGERIA'), 83 | Spacer(), 84 | Container( 85 | height: 39, 86 | width: context.screenWidth(0.13), 87 | child: RaisedButton( 88 | color: Color(0xFFCE0D0D), 89 | padding: EdgeInsets.symmetric(horizontal: 20), 90 | shape: RoundedRectangleBorder( 91 | borderRadius: BorderRadius.circular(4)), 92 | onPressed: () {}, 93 | child: Text( 94 | 'UPGRADE', 95 | style: GoogleFonts.lato( 96 | fontSize: 9, 97 | letterSpacing: 1, 98 | color: white, 99 | fontWeight: FontWeight.w500), 100 | ), 101 | ), 102 | ), 103 | Spacer(), 104 | Row( 105 | children: [ 106 | Text( 107 | 'NETFLIX ', 108 | style: GoogleFonts.lato( 109 | fontSize: 7, 110 | letterSpacing: 1, 111 | color: white.withOpacity(0.2), 112 | fontWeight: FontWeight.w400), 113 | ), 114 | Text( 115 | '1.39', 116 | style: GoogleFonts.lato( 117 | fontSize: 7, 118 | letterSpacing: 1, 119 | color: white.withOpacity(0.2), 120 | fontWeight: FontWeight.w300), 121 | ), 122 | ], 123 | ), 124 | ], 125 | ), 126 | ), 127 | ), 128 | ), 129 | Flexible( 130 | flex: 22, 131 | child: Container( 132 | /// 133 | 134 | child: Column( 135 | mainAxisAlignment: MainAxisAlignment.start, 136 | children: [ 137 | Padding( 138 | padding: const EdgeInsets.symmetric( 139 | horizontal: 60, vertical: 40), 140 | child: Row( 141 | crossAxisAlignment: CrossAxisAlignment.center, 142 | children: [ 143 | Icon( 144 | FeatherIcons.search, 145 | color: white, 146 | size: 11, 147 | ), 148 | const XMargin(20), 149 | Flexible( 150 | flex: 2, 151 | child: TextField( 152 | cursorColor: white, 153 | style: GoogleFonts.lato( 154 | fontSize: 12, 155 | color: white, 156 | letterSpacing: 1.2, 157 | fontWeight: FontWeight.w500), 158 | decoration: InputDecoration( 159 | border: InputBorder.none, 160 | hintText: 'Search...', 161 | hintStyle: GoogleFonts.lato( 162 | fontSize: 11, 163 | color: white.withOpacity(0.6), 164 | fontWeight: FontWeight.w300), 165 | ), 166 | ), 167 | ), 168 | Spacer(), 169 | Text( 170 | 'Chiziaruhoma', 171 | style: GoogleFonts.lato( 172 | fontSize: 8, 173 | letterSpacing: 1, 174 | color: white, 175 | fontWeight: FontWeight.bold), 176 | ), 177 | const XMargin(10), 178 | Container( 179 | height: 35, 180 | width: 35, 181 | decoration: BoxDecoration( 182 | color: Colors.blueGrey[200], 183 | borderRadius: BorderRadius.circular(100), 184 | image: DecorationImage( 185 | fit: BoxFit.cover, 186 | image: NetworkImage( 187 | 'https://pbs.twimg.com/profile_images/1274197880635621376/ZCJygPAs_400x400.jpg'))), 188 | ), 189 | ], 190 | ), 191 | ), 192 | YMargin(context.screenHeight(0.15)), 193 | Expanded( 194 | child: PageView( 195 | controller: prov.controller, 196 | scrollDirection: Axis.horizontal, 197 | onPageChanged: (i) { 198 | prov.selectedIndex = i; 199 | prov.assetsAudioPlayer2.setVolume(0.2); 200 | prov.assetsAudioPlayer2.stop(); 201 | prov.assetsAudioPlayer2.play(); 202 | }, 203 | children: [ 204 | MovieCard( 205 | index: 0, 206 | title: 'STRANGER', 207 | title2: 'THINGS', 208 | ), 209 | MovieCard( 210 | index: 1, 211 | title: 'STRANGER', 212 | title2: 'THINGS', 213 | ), 214 | MovieCard( 215 | index: 2, 216 | title: 'STRANGER', 217 | title2: 'THINGS', 218 | ), 219 | ], 220 | ), 221 | ), 222 | YMargin(context.screenHeight(0.2)), 223 | Stack( 224 | children: [ 225 | Center( 226 | child: SmoothPageIndicator( 227 | controller: prov.controller, 228 | count: 3, 229 | effect: SwapEffect( 230 | // expansionFactor: 4, 231 | dotHeight: 8, 232 | dotWidth: 8, 233 | activeDotColor: Color(0xFFCE0D14), 234 | dotColor: white.withOpacity(0.1)), 235 | ), 236 | ), 237 | Row( 238 | children: [ 239 | Spacer(), 240 | Image.asset( 241 | 'assets/images/nfx_logo.png', 242 | height: 27, 243 | color: white.withOpacity(0.3), 244 | ), 245 | const XMargin(60) 246 | ], 247 | ), 248 | ], 249 | ), 250 | const YMargin(50), 251 | ], 252 | ), 253 | ), 254 | ), 255 | ], 256 | ) 257 | ], 258 | ), 259 | ); 260 | } 261 | } 262 | 263 | class MovieCard extends StatelessWidget { 264 | final String title, title2; 265 | final int index; 266 | 267 | const MovieCard({ 268 | Key key, 269 | @required this.title, 270 | @required this.title2, 271 | @required this.index, 272 | }) : super(key: key); 273 | @override 274 | Widget build(BuildContext context) { 275 | var prov = context.watch(); 276 | return GestureDetector( 277 | onTap: () { 278 | prov.controller.animateToPage(index, 279 | curve: Curves.easeInOut, duration: Duration(milliseconds: 900)); 280 | }, 281 | onDoubleTap: () async{ 282 | await prov.assetsAudioPlayer2.play(); 283 | navigateTransparentRoute(context, Netflix(tag: index)); 284 | }, 285 | child: ClipRRect( 286 | borderRadius: BorderRadius.circular(5), 287 | child: Stack( 288 | children: [ 289 | Hero( 290 | tag: '$index', 291 | child: AnimatedContainer( 292 | duration: Duration(milliseconds: 500), 293 | width: context.screenWidth( 294 | prov.selectedIndex == index ? 0.27 : 0.25, 295 | ), 296 | height: context.screenHeight( 297 | prov.selectedIndex == index ? 0.35 : 0.3, 298 | ), 299 | decoration: BoxDecoration( 300 | borderRadius: BorderRadius.circular(5), 301 | image: DecorationImage( 302 | fit: BoxFit.cover, 303 | image: ExactAssetImage( 304 | 'assets/images/nfx${index > 0 ? index : ''}.png'), 305 | ), 306 | ), 307 | ), 308 | ), 309 | ClipRRect( 310 | borderRadius: BorderRadius.circular(5), 311 | child: AnimatedContainer( 312 | width: context.screenWidth( 313 | prov.selectedIndex == index ? 0.27 / 2 : 0.25 / 2, 314 | ), 315 | height: context.screenHeight( 316 | prov.selectedIndex == index ? 0.35 : 0.3, 317 | ), 318 | duration: Duration(milliseconds: 500), 319 | child: BackdropFilter( 320 | filter: ImageFilter.blur(sigmaX: 6, sigmaY: 5.0), 321 | child: Container( 322 | color: Colors.grey.withOpacity(0.1), 323 | padding: EdgeInsets.only(left: 30), 324 | child: Column( 325 | mainAxisAlignment: MainAxisAlignment.center, 326 | crossAxisAlignment: CrossAxisAlignment.start, 327 | children: [ 328 | Text( 329 | title ?? '', 330 | style: GoogleFonts.lato( 331 | fontSize: prov.selectedIndex == index ? 19 : 14, 332 | letterSpacing: 1, 333 | color: white, 334 | fontWeight: FontWeight.bold), 335 | ), 336 | const YMargin(5), 337 | Text( 338 | title2 ?? '', 339 | style: GoogleFonts.lato( 340 | fontSize: prov.selectedIndex == index ? 17 : 13, 341 | letterSpacing: 1, 342 | color: white, 343 | fontWeight: FontWeight.w200), 344 | ), 345 | const YMargin(25), 346 | Text( 347 | 'SEASON 3 EP ${5 + index}', 348 | style: GoogleFonts.lato( 349 | fontSize: prov.selectedIndex == index ? 8 : 5, 350 | letterSpacing: 1, 351 | color: white, 352 | fontWeight: FontWeight.bold), 353 | ), 354 | ], 355 | ), 356 | ), 357 | ), 358 | ), 359 | ), 360 | if (prov.selectedIndex == index) 361 | AnimatedContainer( 362 | duration: Duration(milliseconds: 500), 363 | width: context.screenWidth( 364 | prov.selectedIndex == index ? 0.27 : 0.25, 365 | ), 366 | height: context 367 | .screenHeight(prov.selectedIndex == index ? 0.35 : 0.3), 368 | decoration: BoxDecoration( 369 | borderRadius: BorderRadius.circular(5), 370 | border: Border.all(color: Color(0xFFCE0D14), width: 3), 371 | ), 372 | ), 373 | ], 374 | ), 375 | ), 376 | ); 377 | } 378 | } 379 | 380 | class MenuItem extends StatelessWidget { 381 | final String s, l; 382 | const MenuItem(this.s, this.l); 383 | 384 | @override 385 | Widget build(BuildContext context) { 386 | return ClipRRect( 387 | borderRadius: BorderRadius.circular(5), 388 | child: Material( 389 | color: Colors.transparent, 390 | child: InkWell( 391 | hoverColor: Colors.black38, 392 | onTap: () {}, 393 | child: Padding( 394 | padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 5), 395 | child: Row( 396 | mainAxisSize: MainAxisSize.min, 397 | children: [ 398 | Text( 399 | '${s ?? ''} ', 400 | style: GoogleFonts.lato( 401 | fontSize: 10, 402 | letterSpacing: 1, 403 | color: white, 404 | fontWeight: FontWeight.bold), 405 | ), 406 | Text( 407 | l ?? '', 408 | style: GoogleFonts.lato( 409 | fontSize: 10, 410 | letterSpacing: 1, 411 | color: white, 412 | fontWeight: FontWeight.w300), 413 | ), 414 | ], 415 | ), 416 | ), 417 | ), 418 | ), 419 | ); 420 | } 421 | } 422 | -------------------------------------------------------------------------------- /lib/views/provider/netflix_vm.dart: -------------------------------------------------------------------------------- 1 | import 'package:assets_audio_player/assets_audio_player.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class NetflixVM extends ChangeNotifier { 5 | final controller = PageController(viewportFraction: 0.4); 6 | int _selectedIndex = 0; 7 | int get selectedIndex => _selectedIndex; 8 | 9 | set selectedIndex(int val) { 10 | _selectedIndex = val; 11 | notifyListeners(); 12 | } 13 | 14 | final assetsAudioPlayer = AssetsAudioPlayer(); 15 | final assetsAudioPlayer2 = AssetsAudioPlayer(); 16 | 17 | init() { 18 | assetsAudioPlayer2.open(Audio("assets/sounds/2.mp3")); 19 | assetsAudioPlayer.open( 20 | Playlist(audios: [ 21 | Audio("assets/sounds/1.wav"), 22 | Audio("assets/sounds/1.wav"), 23 | ]), 24 | loopMode: LoopMode.playlist, //loop the full playlist 25 | ); 26 | 27 | assetsAudioPlayer.setLoopMode(LoopMode.playlist); 28 | 29 | assetsAudioPlayer.setVolume(0.3); 30 | assetsAudioPlayer2.setVolume(0.2); 31 | assetsAudioPlayer.play(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/views/provider/ps5.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Ps5VM extends ChangeNotifier { 4 | bool _dark = false; 5 | bool get dark => _dark; 6 | 7 | set dark(bool val) { 8 | _dark = val; 9 | notifyListeners(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/views/ps5.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/rendering.dart'; 5 | import 'package:flutter_feather_icons/flutter_feather_icons.dart'; 6 | import 'package:google_fonts/google_fonts.dart'; 7 | import 'package:musicapp/utils/margin.dart'; 8 | import 'package:musicapp/utils/spring_button.dart'; 9 | import 'package:musicapp/utils/theme.dart'; 10 | import 'package:provider/provider.dart'; 11 | import 'package:smooth_page_indicator/smooth_page_indicator.dart'; 12 | 13 | import 'provider/ps5.dart'; 14 | 15 | class Ps5 extends StatefulWidget { 16 | Ps5({Key key}) : super(key: key); 17 | 18 | @override 19 | _Ps5State createState() => _Ps5State(); 20 | } 21 | 22 | class _Ps5State extends State { 23 | final controller = PageController(viewportFraction: 0.88); 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | var prov = context.watch(); 28 | return Scaffold( 29 | backgroundColor: prov.dark ? Color(0xFF011E24) : white, 30 | body: Column( 31 | children: [ 32 | const YMargin(30), 33 | Image.asset( 34 | 'assets/images/ps5.png', 35 | color: (prov.dark ? white : grey).withOpacity(0.8), 36 | height: 15, 37 | ), 38 | const YMargin(40), 39 | Padding( 40 | padding: const EdgeInsets.symmetric(horizontal: 90), 41 | child: Row( 42 | crossAxisAlignment: CrossAxisAlignment.center, 43 | children: [ 44 | Container( 45 | height: 45, 46 | width: 45, 47 | decoration: BoxDecoration( 48 | color: Colors.blueGrey[200], 49 | borderRadius: BorderRadius.circular(4), 50 | image: DecorationImage( 51 | fit: BoxFit.contain, 52 | image: NetworkImage( 53 | 'https://pbs.twimg.com/profile_images/1274197880635621376/ZCJygPAs_400x400.jpg'))), 54 | ), 55 | Spacer(), 56 | Spacer(), 57 | Text( 58 | 'L1', 59 | style: GoogleFonts.lato( 60 | fontSize: 11, 61 | color: (prov.dark ? white : textColor).withOpacity(0.2), 62 | fontWeight: FontWeight.w400), 63 | ), 64 | Spacer(), 65 | ClipRRect( 66 | borderRadius: BorderRadius.circular(100), 67 | child: Container( 68 | color: accent.withOpacity(0.1), 69 | padding: EdgeInsets.symmetric(horizontal: 20, vertical: 7), 70 | child: Text( 71 | 'Home', 72 | style: GoogleFonts.lato( 73 | fontSize: 13, 74 | color: (prov.dark ? white : textColor), 75 | fontWeight: FontWeight.w400), 76 | ), 77 | ), 78 | ), 79 | Spacer(), 80 | Text( 81 | 'Library', 82 | style: GoogleFonts.lato( 83 | fontSize: 13, 84 | color: (prov.dark ? white.withOpacity(0.3) : textColor), 85 | fontWeight: FontWeight.w400), 86 | ), 87 | Spacer(), 88 | Text( 89 | 'Store', 90 | style: GoogleFonts.lato( 91 | fontSize: 13, 92 | color: (prov.dark ? white.withOpacity(0.3) : textColor), 93 | fontWeight: FontWeight.w400), 94 | ), 95 | Spacer(), 96 | Text( 97 | 'Media', 98 | style: GoogleFonts.lato( 99 | fontSize: 13, 100 | color: (prov.dark ? white.withOpacity(0.3) : textColor), 101 | fontWeight: FontWeight.w400), 102 | ), 103 | Spacer(), 104 | Text( 105 | 'R1', 106 | style: GoogleFonts.lato( 107 | fontSize: 11, 108 | color: (prov.dark ? white : textColor).withOpacity(0.2), 109 | fontWeight: FontWeight.w400), 110 | ), 111 | Spacer(), 112 | Spacer(), 113 | Text( 114 | '11:12 PM', 115 | style: GoogleFonts.lato( 116 | fontSize: 13, 117 | color: prov.dark ? white : textColor, 118 | fontWeight: FontWeight.w400), 119 | ), 120 | const YMargin(50), 121 | IconButton( 122 | icon: Icon(prov.dark ? FeatherIcons.sun : FeatherIcons.moon), 123 | color: prov.dark ? white : iconColor, 124 | iconSize: 14, 125 | onPressed: () { 126 | prov.dark = !prov.dark; 127 | }, 128 | ), 129 | ], 130 | ), 131 | ), 132 | Expanded( 133 | child: PageView.builder( 134 | controller: controller, 135 | itemCount: games.length, 136 | scrollDirection: Axis.horizontal, 137 | itemBuilder: (context, index) => Center( 138 | child: GameItem(index), 139 | ), 140 | ), 141 | ), 142 | const YMargin(50), 143 | SmoothPageIndicator( 144 | controller: controller, 145 | count: 6, 146 | effect: ExpandingDotsEffect( 147 | expansionFactor: 4, 148 | activeDotColor: prov.dark ? Color(0xffF3CA3E) : accent, 149 | dotColor: 150 | (prov.dark ? Color(0xffF3CA3E) : accent).withOpacity(0.1)), 151 | ), 152 | const YMargin(50), 153 | ], 154 | ), 155 | ); 156 | } 157 | } 158 | 159 | class GameItem extends StatelessWidget { 160 | final int index; 161 | 162 | const GameItem(this.index); 163 | @override 164 | Widget build(BuildContext context) { 165 | var prov = context.watch(); 166 | return Center( 167 | child: Container( 168 | height: context.screenHeight(.5), 169 | child: Row( 170 | crossAxisAlignment: CrossAxisAlignment.center, 171 | children: [ 172 | SpringButton( 173 | child: Container( 174 | height: context.screenWidth(.26), 175 | width: context.screenWidth(.26), 176 | decoration: BoxDecoration( 177 | borderRadius: BorderRadius.circular(3), 178 | boxShadow: [ 179 | BoxShadow( 180 | blurRadius: 97, 181 | spreadRadius: -70, 182 | color: Color(0xffE4B36B), 183 | offset: Offset(0, 32)) 184 | ], 185 | image: DecorationImage( 186 | fit: BoxFit.cover, 187 | image: AssetImage( 188 | 'assets/images/${games[index].img}.png'))), 189 | ), 190 | onTap: () {}, 191 | ), 192 | const XMargin(100), 193 | Column( 194 | mainAxisAlignment: MainAxisAlignment.center, 195 | crossAxisAlignment: CrossAxisAlignment.start, 196 | children: [ 197 | Row( 198 | crossAxisAlignment: CrossAxisAlignment.center, 199 | children: [ 200 | Image.asset( 201 | 'assets/images/ps4.png', 202 | color: prov.dark ? white.withOpacity(0.8) : textColor, 203 | height: 13, 204 | ), 205 | const XMargin(10), 206 | Text( 207 | 'Last Played ${index + 2} days ago', 208 | style: GoogleFonts.ubuntu( 209 | fontSize: 11, 210 | color: prov.dark ? white.withOpacity(0.8) : black, 211 | height: 1.4, 212 | fontWeight: FontWeight.w200), 213 | ), 214 | ], 215 | ), 216 | const YMargin(10), 217 | Text( 218 | games[index]?.name ?? '', 219 | style: GoogleFonts.ptSans( 220 | fontSize: 40, 221 | color: prov.dark ? white : black, 222 | height: 1.4, 223 | fontWeight: FontWeight.w400), 224 | ), 225 | const YMargin(40), 226 | ClipRRect( 227 | borderRadius: BorderRadius.circular(100), 228 | child: Container( 229 | color: (prov.dark ? white : accent).withOpacity(0.1), 230 | padding: EdgeInsets.symmetric(horizontal: 10, vertical: 7), 231 | child: Row( 232 | children: [ 233 | Container( 234 | height: 20, 235 | width: 20, 236 | decoration: BoxDecoration( 237 | color: prov.dark ? Color(0xffF3CA3E) : accent, 238 | borderRadius: BorderRadius.circular(100), 239 | ), 240 | child: Icon( 241 | Icons.close, 242 | color: prov.dark ? iconColor : white, 243 | size: 13, 244 | ), 245 | ), 246 | const XMargin(10), 247 | Text( 248 | 'Tap to Start', 249 | style: GoogleFonts.lato( 250 | fontSize: 12, 251 | color: prov.dark ? Color(0xffE4B36B) : accent, 252 | fontWeight: FontWeight.w400), 253 | ), 254 | const XMargin(10), 255 | ], 256 | ), 257 | ), 258 | ), 259 | ], 260 | ), 261 | ], 262 | ), 263 | ), 264 | ); 265 | } 266 | } 267 | 268 | class Game { 269 | final name, img; 270 | 271 | Game({@required this.name, @required this.img}); 272 | } 273 | 274 | var games = [ 275 | Game(img: 'g6', name: "The Last Of Us"), 276 | Game(img: 'g0', name: "Assasin's Creed: VALHALLA"), 277 | Game(img: 'g1', name: 'Sekiro: Shadows Die Twice'), 278 | Game(img: 'g2', name: 'Red Dead Redemption II'), 279 | Game(img: 'g3', name: 'APEX Legends'), 280 | Game(img: 'g4', name: "EA's FIFA 2020"), 281 | ]; 282 | -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/xcuserdata/ 7 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | import assets_audio_player 9 | import assets_audio_player_web 10 | import path_provider_macos 11 | 12 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 13 | AssetsAudioPlayerPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerPlugin")) 14 | AssetsAudioPlayerWebPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerWebPlugin")) 15 | PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) 16 | } 17 | -------------------------------------------------------------------------------- /macos/Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.11' 2 | 3 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 4 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 5 | 6 | project 'Runner', { 7 | 'Debug' => :debug, 8 | 'Profile' => :release, 9 | 'Release' => :release, 10 | } 11 | 12 | def parse_KV_file(file, separator='=') 13 | file_abs_path = File.expand_path(file) 14 | if !File.exists? file_abs_path 15 | return []; 16 | end 17 | pods_ary = [] 18 | skip_line_start_symbols = ["#", "/"] 19 | File.foreach(file_abs_path) { |line| 20 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 21 | plugin = line.split(pattern=separator) 22 | if plugin.length == 2 23 | podname = plugin[0].strip() 24 | path = plugin[1].strip() 25 | podpath = File.expand_path("#{path}", file_abs_path) 26 | pods_ary.push({:name => podname, :path => podpath}); 27 | else 28 | puts "Invalid plugin specification: #{line}" 29 | end 30 | } 31 | return pods_ary 32 | end 33 | 34 | def pubspec_supports_macos(file) 35 | file_abs_path = File.expand_path(file) 36 | if !File.exists? file_abs_path 37 | return false; 38 | end 39 | File.foreach(file_abs_path) { |line| 40 | return true if line =~ /^\s*macos:/ 41 | } 42 | return false 43 | end 44 | 45 | target 'Runner' do 46 | use_frameworks! 47 | use_modular_headers! 48 | 49 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 50 | # referring to absolute paths on developers' machines. 51 | ephemeral_dir = File.join('Flutter', 'ephemeral') 52 | symlink_dir = File.join(ephemeral_dir, '.symlinks') 53 | symlink_plugins_dir = File.join(symlink_dir, 'plugins') 54 | system("rm -rf #{symlink_dir}") 55 | system("mkdir -p #{symlink_plugins_dir}") 56 | 57 | # Flutter Pods 58 | generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig')) 59 | if generated_xcconfig.empty? 60 | puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 61 | end 62 | generated_xcconfig.map { |p| 63 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 64 | symlink = File.join(symlink_dir, 'flutter') 65 | File.symlink(File.dirname(p[:path]), symlink) 66 | pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path])) 67 | end 68 | } 69 | 70 | # Plugin Pods 71 | plugin_pods = parse_KV_file('../.flutter-plugins') 72 | plugin_pods.map { |p| 73 | symlink = File.join(symlink_plugins_dir, p[:name]) 74 | File.symlink(p[:path], symlink) 75 | if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml')) 76 | pod p[:name], :path => File.join(symlink, 'macos') 77 | end 78 | } 79 | end 80 | 81 | # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. 82 | install! 'cocoapods', :disable_input_output_paths => true 83 | -------------------------------------------------------------------------------- /macos/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - assets_audio_player (0.0.1): 3 | - FlutterMacOS 4 | - assets_audio_player_web (0.0.1): 5 | - FlutterMacOS 6 | - FlutterMacOS (1.0.0) 7 | - path_provider (0.0.1) 8 | - path_provider_macos (0.0.1): 9 | - FlutterMacOS 10 | 11 | DEPENDENCIES: 12 | - assets_audio_player (from `Flutter/ephemeral/.symlinks/plugins/assets_audio_player/macos`) 13 | - assets_audio_player_web (from `Flutter/ephemeral/.symlinks/plugins/assets_audio_player_web/macos`) 14 | - FlutterMacOS (from `Flutter/ephemeral/.symlinks/flutter/darwin-x64`) 15 | - path_provider (from `Flutter/ephemeral/.symlinks/plugins/path_provider/macos`) 16 | - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) 17 | 18 | EXTERNAL SOURCES: 19 | assets_audio_player: 20 | :path: Flutter/ephemeral/.symlinks/plugins/assets_audio_player/macos 21 | assets_audio_player_web: 22 | :path: Flutter/ephemeral/.symlinks/plugins/assets_audio_player_web/macos 23 | FlutterMacOS: 24 | :path: Flutter/ephemeral/.symlinks/flutter/darwin-x64 25 | path_provider: 26 | :path: Flutter/ephemeral/.symlinks/plugins/path_provider/macos 27 | path_provider_macos: 28 | :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos 29 | 30 | SPEC CHECKSUMS: 31 | assets_audio_player: be2578e6f11dd4d183412e97143673c3c4cb2e8a 32 | assets_audio_player_web: 917101123b6db8f73156835c0fa266c11340ff15 33 | FlutterMacOS: 15bea8a44d2fa024068daa0140371c020b4b6ff9 34 | path_provider: e0848572d1d38b9a7dd099e79cf83f5b7e2cde9f 35 | path_provider_macos: a0a3fd666cb7cd0448e936fb4abad4052961002b 36 | 37 | PODFILE CHECKSUM: d8ba9b3e9e93c62c74a660b46c6fcb09f03991a7 38 | 39 | COCOAPODS: 1.8.4 40 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; 13 | buildPhases = ( 14 | 33CC111E2044C6BF0003C045 /* ShellScript */, 15 | ); 16 | dependencies = ( 17 | ); 18 | name = "Flutter Assemble"; 19 | productName = FLX; 20 | }; 21 | /* End PBXAggregateTarget section */ 22 | 23 | /* Begin PBXBuildFile section */ 24 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 25 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 26 | 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 27 | 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 28 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 29 | 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; }; 30 | 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 31 | A8AF45BB2FB723A8871DF2C1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 417DEC629914A6F15413AD2C /* Pods_Runner.framework */; }; 32 | D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; }; 33 | D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXContainerItemProxy section */ 37 | 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = 33CC10E52044A3C60003C045 /* Project object */; 40 | proxyType = 1; 41 | remoteGlobalIDString = 33CC111A2044C6BA0003C045; 42 | remoteInfo = FLX; 43 | }; 44 | /* End PBXContainerItemProxy section */ 45 | 46 | /* Begin PBXCopyFilesBuildPhase section */ 47 | 33CC110E2044A8840003C045 /* Bundle Framework */ = { 48 | isa = PBXCopyFilesBuildPhase; 49 | buildActionMask = 2147483647; 50 | dstPath = ""; 51 | dstSubfolderSpec = 10; 52 | files = ( 53 | D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */, 54 | 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */, 55 | ); 56 | name = "Bundle Framework"; 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXCopyFilesBuildPhase section */ 60 | 61 | /* Begin PBXFileReference section */ 62 | 0A8F3FCA9EF0A5D218C09C37 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 63 | 27F1DF33C1DE32500B742909 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 64 | 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 65 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 66 | 33CC10ED2044A3C60003C045 /* musicapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = musicapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 68 | 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 69 | 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 70 | 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; 71 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; 72 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; 73 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; 74 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; 75 | 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FlutterMacOS.framework; path = Flutter/ephemeral/FlutterMacOS.framework; sourceTree = SOURCE_ROOT; }; 76 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 77 | 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 78 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; 79 | 417DEC629914A6F15413AD2C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | 6C5A97FFF1EA8BFE6EE4E910 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 81 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 82 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 83 | D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; }; 84 | /* End PBXFileReference section */ 85 | 86 | /* Begin PBXFrameworksBuildPhase section */ 87 | 33CC10EA2044A3C60003C045 /* Frameworks */ = { 88 | isa = PBXFrameworksBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | D73912F022F37F9E000D13A0 /* App.framework in Frameworks */, 92 | 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */, 93 | A8AF45BB2FB723A8871DF2C1 /* Pods_Runner.framework in Frameworks */, 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | 33BA886A226E78AF003329D5 /* Configs */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */, 104 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 105 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 106 | 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, 107 | ); 108 | path = Configs; 109 | sourceTree = ""; 110 | }; 111 | 33CC10E42044A3C60003C045 = { 112 | isa = PBXGroup; 113 | children = ( 114 | 33FAB671232836740065AC1E /* Runner */, 115 | 33CEB47122A05771004F2AC0 /* Flutter */, 116 | 33CC10EE2044A3C60003C045 /* Products */, 117 | D73912EC22F37F3D000D13A0 /* Frameworks */, 118 | F86B01F3BB9CB3BD352A50E6 /* Pods */, 119 | ); 120 | sourceTree = ""; 121 | }; 122 | 33CC10EE2044A3C60003C045 /* Products */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 33CC10ED2044A3C60003C045 /* musicapp.app */, 126 | ); 127 | name = Products; 128 | sourceTree = ""; 129 | }; 130 | 33CC11242044D66E0003C045 /* Resources */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 33CC10F22044A3C60003C045 /* Assets.xcassets */, 134 | 33CC10F42044A3C60003C045 /* MainMenu.xib */, 135 | 33CC10F72044A3C60003C045 /* Info.plist */, 136 | ); 137 | name = Resources; 138 | path = ..; 139 | sourceTree = ""; 140 | }; 141 | 33CEB47122A05771004F2AC0 /* Flutter */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 145 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 146 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, 147 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, 148 | D73912EF22F37F9E000D13A0 /* App.framework */, 149 | 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */, 150 | ); 151 | path = Flutter; 152 | sourceTree = ""; 153 | }; 154 | 33FAB671232836740065AC1E /* Runner */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */, 158 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, 159 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */, 160 | 33E51914231749380026EE4D /* Release.entitlements */, 161 | 33CC11242044D66E0003C045 /* Resources */, 162 | 33BA886A226E78AF003329D5 /* Configs */, 163 | ); 164 | path = Runner; 165 | sourceTree = ""; 166 | }; 167 | D73912EC22F37F3D000D13A0 /* Frameworks */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | 417DEC629914A6F15413AD2C /* Pods_Runner.framework */, 171 | ); 172 | name = Frameworks; 173 | sourceTree = ""; 174 | }; 175 | F86B01F3BB9CB3BD352A50E6 /* Pods */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | 6C5A97FFF1EA8BFE6EE4E910 /* Pods-Runner.debug.xcconfig */, 179 | 0A8F3FCA9EF0A5D218C09C37 /* Pods-Runner.release.xcconfig */, 180 | 27F1DF33C1DE32500B742909 /* Pods-Runner.profile.xcconfig */, 181 | ); 182 | name = Pods; 183 | path = Pods; 184 | sourceTree = ""; 185 | }; 186 | /* End PBXGroup section */ 187 | 188 | /* Begin PBXNativeTarget section */ 189 | 33CC10EC2044A3C60003C045 /* Runner */ = { 190 | isa = PBXNativeTarget; 191 | buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; 192 | buildPhases = ( 193 | 96EF43373F8101C6BEF4AE6E /* [CP] Check Pods Manifest.lock */, 194 | 33CC10E92044A3C60003C045 /* Sources */, 195 | 33CC10EA2044A3C60003C045 /* Frameworks */, 196 | 33CC10EB2044A3C60003C045 /* Resources */, 197 | 33CC110E2044A8840003C045 /* Bundle Framework */, 198 | 3399D490228B24CF009A79C7 /* ShellScript */, 199 | 345425B866E62BDCDC7D1F68 /* [CP] Embed Pods Frameworks */, 200 | ); 201 | buildRules = ( 202 | ); 203 | dependencies = ( 204 | 33CC11202044C79F0003C045 /* PBXTargetDependency */, 205 | ); 206 | name = Runner; 207 | productName = Runner; 208 | productReference = 33CC10ED2044A3C60003C045 /* musicapp.app */; 209 | productType = "com.apple.product-type.application"; 210 | }; 211 | /* End PBXNativeTarget section */ 212 | 213 | /* Begin PBXProject section */ 214 | 33CC10E52044A3C60003C045 /* Project object */ = { 215 | isa = PBXProject; 216 | attributes = { 217 | LastSwiftUpdateCheck = 0920; 218 | LastUpgradeCheck = 0930; 219 | ORGANIZATIONNAME = "The Flutter Authors"; 220 | TargetAttributes = { 221 | 33CC10EC2044A3C60003C045 = { 222 | CreatedOnToolsVersion = 9.2; 223 | LastSwiftMigration = 1100; 224 | ProvisioningStyle = Automatic; 225 | SystemCapabilities = { 226 | com.apple.Sandbox = { 227 | enabled = 1; 228 | }; 229 | }; 230 | }; 231 | 33CC111A2044C6BA0003C045 = { 232 | CreatedOnToolsVersion = 9.2; 233 | ProvisioningStyle = Manual; 234 | }; 235 | }; 236 | }; 237 | buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; 238 | compatibilityVersion = "Xcode 8.0"; 239 | developmentRegion = en; 240 | hasScannedForEncodings = 0; 241 | knownRegions = ( 242 | en, 243 | Base, 244 | ); 245 | mainGroup = 33CC10E42044A3C60003C045; 246 | productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; 247 | projectDirPath = ""; 248 | projectRoot = ""; 249 | targets = ( 250 | 33CC10EC2044A3C60003C045 /* Runner */, 251 | 33CC111A2044C6BA0003C045 /* Flutter Assemble */, 252 | ); 253 | }; 254 | /* End PBXProject section */ 255 | 256 | /* Begin PBXResourcesBuildPhase section */ 257 | 33CC10EB2044A3C60003C045 /* Resources */ = { 258 | isa = PBXResourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 262 | 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, 263 | ); 264 | runOnlyForDeploymentPostprocessing = 0; 265 | }; 266 | /* End PBXResourcesBuildPhase section */ 267 | 268 | /* Begin PBXShellScriptBuildPhase section */ 269 | 3399D490228B24CF009A79C7 /* ShellScript */ = { 270 | isa = PBXShellScriptBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | ); 274 | inputFileListPaths = ( 275 | ); 276 | inputPaths = ( 277 | ); 278 | outputFileListPaths = ( 279 | ); 280 | outputPaths = ( 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | shellPath = /bin/sh; 284 | shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename\n"; 285 | }; 286 | 33CC111E2044C6BF0003C045 /* ShellScript */ = { 287 | isa = PBXShellScriptBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | inputFileListPaths = ( 292 | Flutter/ephemeral/FlutterInputs.xcfilelist, 293 | ); 294 | inputPaths = ( 295 | Flutter/ephemeral/tripwire, 296 | ); 297 | outputFileListPaths = ( 298 | Flutter/ephemeral/FlutterOutputs.xcfilelist, 299 | ); 300 | outputPaths = ( 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | shellPath = /bin/sh; 304 | shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n"; 305 | }; 306 | 345425B866E62BDCDC7D1F68 /* [CP] Embed Pods Frameworks */ = { 307 | isa = PBXShellScriptBuildPhase; 308 | buildActionMask = 2147483647; 309 | files = ( 310 | ); 311 | inputFileListPaths = ( 312 | ); 313 | name = "[CP] Embed Pods Frameworks"; 314 | outputFileListPaths = ( 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | shellPath = /bin/sh; 318 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 319 | showEnvVarsInLog = 0; 320 | }; 321 | 96EF43373F8101C6BEF4AE6E /* [CP] Check Pods Manifest.lock */ = { 322 | isa = PBXShellScriptBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | ); 326 | inputFileListPaths = ( 327 | ); 328 | inputPaths = ( 329 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 330 | "${PODS_ROOT}/Manifest.lock", 331 | ); 332 | name = "[CP] Check Pods Manifest.lock"; 333 | outputFileListPaths = ( 334 | ); 335 | outputPaths = ( 336 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 337 | ); 338 | runOnlyForDeploymentPostprocessing = 0; 339 | shellPath = /bin/sh; 340 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 341 | showEnvVarsInLog = 0; 342 | }; 343 | /* End PBXShellScriptBuildPhase section */ 344 | 345 | /* Begin PBXSourcesBuildPhase section */ 346 | 33CC10E92044A3C60003C045 /* Sources */ = { 347 | isa = PBXSourcesBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, 351 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, 352 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, 353 | ); 354 | runOnlyForDeploymentPostprocessing = 0; 355 | }; 356 | /* End PBXSourcesBuildPhase section */ 357 | 358 | /* Begin PBXTargetDependency section */ 359 | 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { 360 | isa = PBXTargetDependency; 361 | target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; 362 | targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; 363 | }; 364 | /* End PBXTargetDependency section */ 365 | 366 | /* Begin PBXVariantGroup section */ 367 | 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { 368 | isa = PBXVariantGroup; 369 | children = ( 370 | 33CC10F52044A3C60003C045 /* Base */, 371 | ); 372 | name = MainMenu.xib; 373 | path = Runner; 374 | sourceTree = ""; 375 | }; 376 | /* End PBXVariantGroup section */ 377 | 378 | /* Begin XCBuildConfiguration section */ 379 | 338D0CE9231458BD00FA5F75 /* Profile */ = { 380 | isa = XCBuildConfiguration; 381 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 382 | buildSettings = { 383 | ALWAYS_SEARCH_USER_PATHS = NO; 384 | CLANG_ANALYZER_NONNULL = YES; 385 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 386 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 387 | CLANG_CXX_LIBRARY = "libc++"; 388 | CLANG_ENABLE_MODULES = YES; 389 | CLANG_ENABLE_OBJC_ARC = YES; 390 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 391 | CLANG_WARN_BOOL_CONVERSION = YES; 392 | CLANG_WARN_CONSTANT_CONVERSION = YES; 393 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 394 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 395 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 396 | CLANG_WARN_EMPTY_BODY = YES; 397 | CLANG_WARN_ENUM_CONVERSION = YES; 398 | CLANG_WARN_INFINITE_RECURSION = YES; 399 | CLANG_WARN_INT_CONVERSION = YES; 400 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 401 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 403 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 404 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 405 | CODE_SIGN_IDENTITY = "-"; 406 | COPY_PHASE_STRIP = NO; 407 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 408 | ENABLE_NS_ASSERTIONS = NO; 409 | ENABLE_STRICT_OBJC_MSGSEND = YES; 410 | GCC_C_LANGUAGE_STANDARD = gnu11; 411 | GCC_NO_COMMON_BLOCKS = YES; 412 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 413 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 414 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 415 | GCC_WARN_UNUSED_FUNCTION = YES; 416 | GCC_WARN_UNUSED_VARIABLE = YES; 417 | MACOSX_DEPLOYMENT_TARGET = 10.11; 418 | MTL_ENABLE_DEBUG_INFO = NO; 419 | SDKROOT = macosx; 420 | SWIFT_COMPILATION_MODE = wholemodule; 421 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 422 | }; 423 | name = Profile; 424 | }; 425 | 338D0CEA231458BD00FA5F75 /* Profile */ = { 426 | isa = XCBuildConfiguration; 427 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 428 | buildSettings = { 429 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 430 | CLANG_ENABLE_MODULES = YES; 431 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 432 | CODE_SIGN_STYLE = Automatic; 433 | COMBINE_HIDPI_IMAGES = YES; 434 | FRAMEWORK_SEARCH_PATHS = ( 435 | "$(inherited)", 436 | "$(PROJECT_DIR)/Flutter/ephemeral", 437 | ); 438 | INFOPLIST_FILE = Runner/Info.plist; 439 | LD_RUNPATH_SEARCH_PATHS = ( 440 | "$(inherited)", 441 | "@executable_path/../Frameworks", 442 | ); 443 | PRODUCT_BUNDLE_IDENTIFIER = com.flutter.musicapp; 444 | PROVISIONING_PROFILE_SPECIFIER = ""; 445 | SWIFT_VERSION = 5.0; 446 | }; 447 | name = Profile; 448 | }; 449 | 338D0CEB231458BD00FA5F75 /* Profile */ = { 450 | isa = XCBuildConfiguration; 451 | buildSettings = { 452 | CODE_SIGN_STYLE = Manual; 453 | PRODUCT_NAME = "$(TARGET_NAME)"; 454 | }; 455 | name = Profile; 456 | }; 457 | 33CC10F92044A3C60003C045 /* Debug */ = { 458 | isa = XCBuildConfiguration; 459 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 460 | buildSettings = { 461 | ALWAYS_SEARCH_USER_PATHS = NO; 462 | CLANG_ANALYZER_NONNULL = YES; 463 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 464 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 465 | CLANG_CXX_LIBRARY = "libc++"; 466 | CLANG_ENABLE_MODULES = YES; 467 | CLANG_ENABLE_OBJC_ARC = YES; 468 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 469 | CLANG_WARN_BOOL_CONVERSION = YES; 470 | CLANG_WARN_CONSTANT_CONVERSION = YES; 471 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 472 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 473 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 474 | CLANG_WARN_EMPTY_BODY = YES; 475 | CLANG_WARN_ENUM_CONVERSION = YES; 476 | CLANG_WARN_INFINITE_RECURSION = YES; 477 | CLANG_WARN_INT_CONVERSION = YES; 478 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 479 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 480 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 481 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 482 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 483 | CODE_SIGN_IDENTITY = "-"; 484 | COPY_PHASE_STRIP = NO; 485 | DEBUG_INFORMATION_FORMAT = dwarf; 486 | ENABLE_STRICT_OBJC_MSGSEND = YES; 487 | ENABLE_TESTABILITY = YES; 488 | GCC_C_LANGUAGE_STANDARD = gnu11; 489 | GCC_DYNAMIC_NO_PIC = NO; 490 | GCC_NO_COMMON_BLOCKS = YES; 491 | GCC_OPTIMIZATION_LEVEL = 0; 492 | GCC_PREPROCESSOR_DEFINITIONS = ( 493 | "DEBUG=1", 494 | "$(inherited)", 495 | ); 496 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 497 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 498 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 499 | GCC_WARN_UNUSED_FUNCTION = YES; 500 | GCC_WARN_UNUSED_VARIABLE = YES; 501 | MACOSX_DEPLOYMENT_TARGET = 10.11; 502 | MTL_ENABLE_DEBUG_INFO = YES; 503 | ONLY_ACTIVE_ARCH = YES; 504 | SDKROOT = macosx; 505 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 506 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 507 | }; 508 | name = Debug; 509 | }; 510 | 33CC10FA2044A3C60003C045 /* Release */ = { 511 | isa = XCBuildConfiguration; 512 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 513 | buildSettings = { 514 | ALWAYS_SEARCH_USER_PATHS = NO; 515 | CLANG_ANALYZER_NONNULL = YES; 516 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 517 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 518 | CLANG_CXX_LIBRARY = "libc++"; 519 | CLANG_ENABLE_MODULES = YES; 520 | CLANG_ENABLE_OBJC_ARC = YES; 521 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 522 | CLANG_WARN_BOOL_CONVERSION = YES; 523 | CLANG_WARN_CONSTANT_CONVERSION = YES; 524 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 525 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 526 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 527 | CLANG_WARN_EMPTY_BODY = YES; 528 | CLANG_WARN_ENUM_CONVERSION = YES; 529 | CLANG_WARN_INFINITE_RECURSION = YES; 530 | CLANG_WARN_INT_CONVERSION = YES; 531 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 532 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 533 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 534 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 535 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 536 | CODE_SIGN_IDENTITY = "-"; 537 | COPY_PHASE_STRIP = NO; 538 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 539 | ENABLE_NS_ASSERTIONS = NO; 540 | ENABLE_STRICT_OBJC_MSGSEND = YES; 541 | GCC_C_LANGUAGE_STANDARD = gnu11; 542 | GCC_NO_COMMON_BLOCKS = YES; 543 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 544 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 545 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 546 | GCC_WARN_UNUSED_FUNCTION = YES; 547 | GCC_WARN_UNUSED_VARIABLE = YES; 548 | MACOSX_DEPLOYMENT_TARGET = 10.11; 549 | MTL_ENABLE_DEBUG_INFO = NO; 550 | SDKROOT = macosx; 551 | SWIFT_COMPILATION_MODE = wholemodule; 552 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 553 | }; 554 | name = Release; 555 | }; 556 | 33CC10FC2044A3C60003C045 /* Debug */ = { 557 | isa = XCBuildConfiguration; 558 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 559 | buildSettings = { 560 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 561 | CLANG_ENABLE_MODULES = YES; 562 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 563 | CODE_SIGN_STYLE = Automatic; 564 | COMBINE_HIDPI_IMAGES = YES; 565 | FRAMEWORK_SEARCH_PATHS = ( 566 | "$(inherited)", 567 | "$(PROJECT_DIR)/Flutter/ephemeral", 568 | ); 569 | INFOPLIST_FILE = Runner/Info.plist; 570 | LD_RUNPATH_SEARCH_PATHS = ( 571 | "$(inherited)", 572 | "@executable_path/../Frameworks", 573 | ); 574 | PRODUCT_BUNDLE_IDENTIFIER = com.flutter.musicapp; 575 | PROVISIONING_PROFILE_SPECIFIER = ""; 576 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 577 | SWIFT_VERSION = 5.0; 578 | }; 579 | name = Debug; 580 | }; 581 | 33CC10FD2044A3C60003C045 /* Release */ = { 582 | isa = XCBuildConfiguration; 583 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 584 | buildSettings = { 585 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 586 | CLANG_ENABLE_MODULES = YES; 587 | CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; 588 | CODE_SIGN_STYLE = Automatic; 589 | COMBINE_HIDPI_IMAGES = YES; 590 | FRAMEWORK_SEARCH_PATHS = ( 591 | "$(inherited)", 592 | "$(PROJECT_DIR)/Flutter/ephemeral", 593 | ); 594 | INFOPLIST_FILE = Runner/Info.plist; 595 | LD_RUNPATH_SEARCH_PATHS = ( 596 | "$(inherited)", 597 | "@executable_path/../Frameworks", 598 | ); 599 | PRODUCT_BUNDLE_IDENTIFIER = com.flutter.musicapp; 600 | PROVISIONING_PROFILE_SPECIFIER = ""; 601 | SWIFT_VERSION = 5.0; 602 | }; 603 | name = Release; 604 | }; 605 | 33CC111C2044C6BA0003C045 /* Debug */ = { 606 | isa = XCBuildConfiguration; 607 | buildSettings = { 608 | CODE_SIGN_STYLE = Manual; 609 | PRODUCT_NAME = "$(TARGET_NAME)"; 610 | }; 611 | name = Debug; 612 | }; 613 | 33CC111D2044C6BA0003C045 /* Release */ = { 614 | isa = XCBuildConfiguration; 615 | buildSettings = { 616 | CODE_SIGN_STYLE = Automatic; 617 | PRODUCT_NAME = "$(TARGET_NAME)"; 618 | }; 619 | name = Release; 620 | }; 621 | /* End XCBuildConfiguration section */ 622 | 623 | /* Begin XCConfigurationList section */ 624 | 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { 625 | isa = XCConfigurationList; 626 | buildConfigurations = ( 627 | 33CC10F92044A3C60003C045 /* Debug */, 628 | 33CC10FA2044A3C60003C045 /* Release */, 629 | 338D0CE9231458BD00FA5F75 /* Profile */, 630 | ); 631 | defaultConfigurationIsVisible = 0; 632 | defaultConfigurationName = Release; 633 | }; 634 | 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { 635 | isa = XCConfigurationList; 636 | buildConfigurations = ( 637 | 33CC10FC2044A3C60003C045 /* Debug */, 638 | 33CC10FD2044A3C60003C045 /* Release */, 639 | 338D0CEA231458BD00FA5F75 /* Profile */, 640 | ); 641 | defaultConfigurationIsVisible = 0; 642 | defaultConfigurationName = Release; 643 | }; 644 | 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { 645 | isa = XCConfigurationList; 646 | buildConfigurations = ( 647 | 33CC111C2044C6BA0003C045 /* Debug */, 648 | 33CC111D2044C6BA0003C045 /* Release */, 649 | 338D0CEB231458BD00FA5F75 /* Profile */, 650 | ); 651 | defaultConfigurationIsVisible = 0; 652 | defaultConfigurationName = Release; 653 | }; 654 | /* End XCConfigurationList section */ 655 | }; 656 | rootObject = 33CC10E52044A3C60003C045 /* Project object */; 657 | } 658 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "app_icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "app_icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "app_icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "app_icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "app_icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "app_icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "app_icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "app_icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "app_icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "app_icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /macos/Runner/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |

24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | -------------------------------------------------------------------------------- /macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = musicapp 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.example.musicapp 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2020 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.network.server 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | musicapp 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSApplicationCategoryType 24 | public.app-category.business 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | $(PRODUCT_COPYRIGHT) 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | var windowFrame = self.frame 8 | self.titlebarAppearsTransparent = true 9 | self.minSize = NSSize(width: 1000, height: 400) 10 | windowFrame.size = NSSize(width: 1266, height: 668) 11 | self.contentViewController = flutterViewController 12 | self.isOpaque = false 13 | self.setFrame(windowFrame, display: true) 14 | 15 | RegisterGeneratedPlugins(registry: flutterViewController) 16 | 17 | super.awakeFromNib() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | assets_audio_player: 5 | dependency: "direct main" 6 | description: 7 | name: assets_audio_player 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.6+3" 11 | assets_audio_player_web: 12 | dependency: transitive 13 | description: 14 | name: assets_audio_player_web 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.0.6+3" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.4.1" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.0.0" 32 | charcode: 33 | dependency: transitive 34 | description: 35 | name: charcode 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.3" 39 | clock: 40 | dependency: transitive 41 | description: 42 | name: clock 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.0.1" 46 | collection: 47 | dependency: transitive 48 | description: 49 | name: collection 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.14.12" 53 | convert: 54 | dependency: transitive 55 | description: 56 | name: convert 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.1" 60 | crypto: 61 | dependency: transitive 62 | description: 63 | name: crypto 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "2.1.5" 67 | cupertino_icons: 68 | dependency: "direct main" 69 | description: 70 | name: cupertino_icons 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "0.1.3" 74 | fake_async: 75 | dependency: transitive 76 | description: 77 | name: fake_async 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.1.0" 81 | file: 82 | dependency: transitive 83 | description: 84 | name: file 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "5.2.0" 88 | flutter: 89 | dependency: "direct main" 90 | description: flutter 91 | source: sdk 92 | version: "0.0.0" 93 | flutter_feather_icons: 94 | dependency: "direct main" 95 | description: 96 | name: flutter_feather_icons 97 | url: "https://pub.dartlang.org" 98 | source: hosted 99 | version: "1.0.3" 100 | flutter_test: 101 | dependency: "direct dev" 102 | description: flutter 103 | source: sdk 104 | version: "0.0.0" 105 | flutter_web_plugins: 106 | dependency: transitive 107 | description: flutter 108 | source: sdk 109 | version: "0.0.0" 110 | google_fonts: 111 | dependency: "direct main" 112 | description: 113 | name: google_fonts 114 | url: "https://pub.dartlang.org" 115 | source: hosted 116 | version: "1.0.0" 117 | http: 118 | dependency: transitive 119 | description: 120 | name: http 121 | url: "https://pub.dartlang.org" 122 | source: hosted 123 | version: "0.12.1" 124 | http_parser: 125 | dependency: transitive 126 | description: 127 | name: http_parser 128 | url: "https://pub.dartlang.org" 129 | source: hosted 130 | version: "3.1.4" 131 | intl: 132 | dependency: transitive 133 | description: 134 | name: intl 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "0.16.1" 138 | line_icons: 139 | dependency: "direct main" 140 | description: 141 | name: line_icons 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "0.2.0" 145 | matcher: 146 | dependency: transitive 147 | description: 148 | name: matcher 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "0.12.6" 152 | meta: 153 | dependency: transitive 154 | description: 155 | name: meta 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "1.1.8" 159 | nested: 160 | dependency: transitive 161 | description: 162 | name: nested 163 | url: "https://pub.dartlang.org" 164 | source: hosted 165 | version: "0.0.4" 166 | path: 167 | dependency: transitive 168 | description: 169 | name: path 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "1.7.0" 173 | path_provider: 174 | dependency: transitive 175 | description: 176 | name: path_provider 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.6.11" 180 | path_provider_linux: 181 | dependency: transitive 182 | description: 183 | name: path_provider_linux 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "0.0.1+1" 187 | path_provider_macos: 188 | dependency: transitive 189 | description: 190 | name: path_provider_macos 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "0.0.4+3" 194 | path_provider_platform_interface: 195 | dependency: transitive 196 | description: 197 | name: path_provider_platform_interface 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "1.0.2" 201 | pedantic: 202 | dependency: transitive 203 | description: 204 | name: pedantic 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "1.9.0" 208 | platform: 209 | dependency: transitive 210 | description: 211 | name: platform 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "2.2.1" 215 | plugin_platform_interface: 216 | dependency: transitive 217 | description: 218 | name: plugin_platform_interface 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "1.0.2" 222 | process: 223 | dependency: transitive 224 | description: 225 | name: process 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "3.0.13" 229 | provider: 230 | dependency: "direct main" 231 | description: 232 | name: provider 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "4.1.0-dev+3" 236 | rxdart: 237 | dependency: transitive 238 | description: 239 | name: rxdart 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "0.24.1" 243 | sky_engine: 244 | dependency: transitive 245 | description: flutter 246 | source: sdk 247 | version: "0.0.99" 248 | smooth_page_indicator: 249 | dependency: "direct main" 250 | description: 251 | name: smooth_page_indicator 252 | url: "https://pub.dartlang.org" 253 | source: hosted 254 | version: "0.1.5" 255 | source_span: 256 | dependency: transitive 257 | description: 258 | name: source_span 259 | url: "https://pub.dartlang.org" 260 | source: hosted 261 | version: "1.7.0" 262 | stack_trace: 263 | dependency: transitive 264 | description: 265 | name: stack_trace 266 | url: "https://pub.dartlang.org" 267 | source: hosted 268 | version: "1.9.3" 269 | stream_channel: 270 | dependency: transitive 271 | description: 272 | name: stream_channel 273 | url: "https://pub.dartlang.org" 274 | source: hosted 275 | version: "2.0.0" 276 | string_scanner: 277 | dependency: transitive 278 | description: 279 | name: string_scanner 280 | url: "https://pub.dartlang.org" 281 | source: hosted 282 | version: "1.0.5" 283 | term_glyph: 284 | dependency: transitive 285 | description: 286 | name: term_glyph 287 | url: "https://pub.dartlang.org" 288 | source: hosted 289 | version: "1.1.0" 290 | test_api: 291 | dependency: transitive 292 | description: 293 | name: test_api 294 | url: "https://pub.dartlang.org" 295 | source: hosted 296 | version: "0.2.15" 297 | typed_data: 298 | dependency: transitive 299 | description: 300 | name: typed_data 301 | url: "https://pub.dartlang.org" 302 | source: hosted 303 | version: "1.1.6" 304 | uuid: 305 | dependency: transitive 306 | description: 307 | name: uuid 308 | url: "https://pub.dartlang.org" 309 | source: hosted 310 | version: "2.1.0" 311 | vector_math: 312 | dependency: transitive 313 | description: 314 | name: vector_math 315 | url: "https://pub.dartlang.org" 316 | source: hosted 317 | version: "2.0.8" 318 | xdg_directories: 319 | dependency: transitive 320 | description: 321 | name: xdg_directories 322 | url: "https://pub.dartlang.org" 323 | source: hosted 324 | version: "0.1.0" 325 | sdks: 326 | dart: ">=2.7.0 <3.0.0" 327 | flutter: ">=1.15.17-pre.5 <2.0.0" 328 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: musicapp 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.7.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | 27 | 28 | # The following adds the Cupertino Icons font to your application. 29 | # Use with the CupertinoIcons class for iOS style icons. 30 | cupertino_icons: ^0.1.3 31 | provider: 4.1.0-dev+3 32 | flutter_feather_icons: 1.0.3 33 | line_icons: 0.2.0 34 | google_fonts: 1.0.0 35 | smooth_page_indicator: 0.1.5 36 | assets_audio_player: ^2.0.6+3 37 | 38 | #reorderables: 0.3.2 39 | 40 | 41 | dev_dependencies: 42 | flutter_test: 43 | sdk: flutter 44 | 45 | # For information on the generic Dart part of this file, see the 46 | # following page: https://dart.dev/tools/pub/pubspec 47 | 48 | # The following section is specific to Flutter. 49 | flutter: 50 | 51 | # The following line ensures that the Material Icons font is 52 | # included with your application, so that you can use the icons in 53 | # the material Icons class. 54 | uses-material-design: true 55 | 56 | # To add assets to your application, add an assets section, like this: 57 | assets: 58 | - assets/images/ 59 | - assets/sounds/ 60 | 61 | # An image asset can refer to one or more resolution-specific "variants", see 62 | # https://flutter.dev/assets-and-images/#resolution-aware. 63 | 64 | # For details regarding adding assets from package dependencies, see 65 | # https://flutter.dev/assets-and-images/#from-packages 66 | 67 | # To add custom fonts to your application, add a fonts section here, 68 | # in this "flutter" section. Each entry in this list should have a 69 | # "family" key with the font family name, and a "fonts" key with a 70 | # list giving the asset and other descriptors for the font. For 71 | # example: 72 | # fonts: 73 | # - family: Schyler 74 | # fonts: 75 | # - asset: fonts/Schyler-Regular.ttf 76 | # - asset: fonts/Schyler-Italic.ttf 77 | # style: italic 78 | # - family: Trajan Pro 79 | # fonts: 80 | # - asset: fonts/TrajanPro.ttf 81 | # - asset: fonts/TrajanPro_Bold.ttf 82 | # weight: 700 83 | # 84 | # For details regarding fonts from package dependencies, 85 | # see https://flutter.dev/custom-fonts/#from-packages 86 | -------------------------------------------------------------------------------- /screenshot/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/screenshot/info.png -------------------------------------------------------------------------------- /screenshot/splash.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/screenshot/splash.gif -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:musicapp/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zfinix/flutter-desktop-examples/3d840594385c95594b7f81347b7944f853fdf35a/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | musicapp 18 | 19 | 20 | 21 | 24 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "musicapp", 3 | "short_name": "musicapp", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | } 22 | ] 23 | } 24 | --------------------------------------------------------------------------------