├── ui ├── preview.png └── attachment.png ├── web ├── assets │ ├── ide.png │ ├── Unisa.png │ ├── group.png │ ├── Pinterest.png │ ├── Statusdark.png │ ├── iPhoneXxc.png │ ├── crystal-shaw-515211-unsplash.png │ ├── joshua-rawson-harris-495411-unsplash.png │ └── FontManifest.json ├── index.html └── main.dart ├── lib ├── helper │ └── ui_helper.dart ├── main.dart └── view │ ├── profile.dart │ └── about.dart ├── pubspec.yaml ├── LICENSE.txt ├── test └── widget_test.dart ├── README_CN.md ├── .gitignore ├── README.md └── pubspec.lock /ui/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/ui/preview.png -------------------------------------------------------------------------------- /ui/attachment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/ui/attachment.png -------------------------------------------------------------------------------- /web/assets/ide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/ide.png -------------------------------------------------------------------------------- /web/assets/Unisa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/Unisa.png -------------------------------------------------------------------------------- /web/assets/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/group.png -------------------------------------------------------------------------------- /web/assets/Pinterest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/Pinterest.png -------------------------------------------------------------------------------- /web/assets/Statusdark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/Statusdark.png -------------------------------------------------------------------------------- /web/assets/iPhoneXxc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/iPhoneXxc.png -------------------------------------------------------------------------------- /web/assets/crystal-shaw-515211-unsplash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/crystal-shaw-515211-unsplash.png -------------------------------------------------------------------------------- /web/assets/joshua-rawson-harris-495411-unsplash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flutter-ui-challenges/flutter_web_challenge_profile/HEAD/web/assets/joshua-rawson-harris-495411-unsplash.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /web/assets/FontManifest.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "family": "MaterialIcons", 4 | "fonts": [ 5 | { 6 | "asset": "https://fonts.gstatic.com/s/materialicons/v42/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2" 7 | } 8 | ] 9 | } 10 | 11 | ] 12 | -------------------------------------------------------------------------------- /web/main.dart: -------------------------------------------------------------------------------- 1 | // Copyright 2019 The Chromium Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | import 'package:flutter_web_ui/ui.dart' as ui; 5 | import 'package:flutter_web_challenge_profile/main.dart' as app; 6 | main() async { 7 | await ui.webOnlyInitializePlatform(); 8 | app.main(); 9 | } 10 | -------------------------------------------------------------------------------- /lib/helper/ui_helper.dart: -------------------------------------------------------------------------------- 1 | import 'dart:core'; 2 | 3 | /// ui standard 4 | final standardWidth = 1400.0; 5 | final standardHeight = 900.0; 6 | int index = 0; 7 | /// late init 8 | double screenWidth; 9 | double screenHeight; 10 | 11 | /// scale [height] by [standardHeight] 12 | double realH(double height) { 13 | assert(screenHeight != 0.0); 14 | return height / standardHeight * screenHeight; 15 | } 16 | 17 | // scale [width] by [ standardWidth ] 18 | double realW(double width) { 19 | assert(screenWidth != 0.0); 20 | return width / standardWidth * screenWidth; 21 | } 22 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_web_challenge_profile 2 | 3 | environment: 4 | # You must be using Flutter >=1.5.0 or Dart >=2.3.0 5 | sdk: '>=2.3.0-dev.0.1 <3.0.0' 6 | 7 | dependencies: 8 | flutter_web: any 9 | flutter_web_ui: any 10 | 11 | 12 | dev_dependencies: 13 | build_runner: ^1.4.0 14 | build_web_compilers: ^2.0.0 15 | 16 | dependency_overrides: 17 | flutter_web: 18 | git: 19 | url: https://github.com/flutter/flutter_web 20 | path: packages/flutter_web 21 | flutter_web_ui: 22 | git: 23 | url: https://github.com/flutter/flutter_web 24 | path: packages/flutter_web_ui 25 | flutter_web_test: 26 | git: 27 | url: https://github.com/flutter/flutter_web 28 | path: packages/flutter_web_test -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_web/material.dart'; 2 | import 'package:flutter_web_challenge_profile/view/about.dart'; 3 | 4 | void main() => runApp(MyApp()); 5 | 6 | class MyApp extends StatelessWidget { 7 | // This widget is the root of your application. 8 | @override 9 | Widget build(BuildContext context) { 10 | return MaterialApp( 11 | title: 'Flutter Demo', 12 | theme: ThemeData( 13 | // This is the theme of your application. 14 | // 15 | // Try running your application with "flutter run". You'll see the 16 | // application has a blue toolbar. Then, without quitting the app, try 17 | // changing the primarySwatch below to Colors.green and then invoke 18 | // "hot reload" (press "r" in the console where you ran "flutter run", 19 | // or simply save your changes to "hot reload" in a Flutter IDE). 20 | // Notice that the counter didn't reset back to zero; the application 21 | // is not restarted. 22 | primarySwatch: Colors.blue, 23 | ), 24 | home: AboutPage(), 25 | ); 26 | } 27 | } -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019git commit -m "first commit" ditclear 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /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:flutter_web_challenge_profile/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 | -------------------------------------------------------------------------------- /README_CN.md: -------------------------------------------------------------------------------- 1 | # flutter_web_challenge_profile 2 | 3 | 使用Flutter_web实现[uplabs](https://www.uplabs.com/posts/google-maps-redesign-919dd0d6-0883-4378-b5b2-f77e36adb6b5)上Google Maps的UI挑战 4 | 5 | > 设计师 : [cassian.design](https://www.uplabs.com/cassian) 6 | > 7 | > Uplabs : 8 | > 9 | > 开发者 : [ditclear](https://github.com/ditclear) 10 | 11 | #### 体验一下 12 | 13 | 首先,确保安装了相关的环境,请参考[Flutter-web](https://github.com/flutter/flutter_web). 14 | 15 | 然后克隆 16 | 17 | > git clone https://github.com/flutter-ui-challenges/flutter_web_challenge_googlemaps.git 18 | 19 | 你可以使用Android Studio 、IntelliJ或者Visual Studio Code打开项目,然后运行`main.dart`文件 20 | 21 | #### 效果图 22 | 23 | ![](ui/preview.png) 24 | 25 | ![](ui/attachment.png) 26 | 27 | 28 | 29 | ### License 30 | 31 | ``` 32 | Copyright 2019 ditclear 33 | 34 | Licensed under the Apache License, Version 2.0 (the "License"); 35 | you may not use this file except in compliance with the License. 36 | You may obtain a copy of the License at 37 | 38 | http://www.apache.org/licenses/LICENSE-2.0 39 | 40 | Unless required by applicable law or agreed to in writing, software 41 | distributed under the License is distributed on an "AS IS" BASIS, 42 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 43 | See the License for the specific language governing permissions and 44 | limitations under the License. 45 | ``` 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /.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 | # Visual Studio Code related 19 | .vscode/ 20 | 21 | # Flutter/Dart/Pub related 22 | **/doc/api/ 23 | .dart_tool/ 24 | .flutter-plugins 25 | .packages 26 | .pub-cache/ 27 | .pub/ 28 | /build/ 29 | 30 | # Android related 31 | **/android/**/gradle-wrapper.jar 32 | **/android/.gradle 33 | **/android/captures/ 34 | **/android/gradlew 35 | **/android/gradlew.bat 36 | **/android/local.properties 37 | **/android/**/GeneratedPluginRegistrant.java 38 | 39 | # iOS/XCode related 40 | **/ios/**/*.mode1v3 41 | **/ios/**/*.mode2v3 42 | **/ios/**/*.moved-aside 43 | **/ios/**/*.pbxuser 44 | **/ios/**/*.perspectivev3 45 | **/ios/**/*sync/ 46 | **/ios/**/.sconsign.dblite 47 | **/ios/**/.tags* 48 | **/ios/**/.vagrant/ 49 | **/ios/**/DerivedData/ 50 | **/ios/**/Icon? 51 | **/ios/**/Pods/ 52 | **/ios/**/.symlinks/ 53 | **/ios/**/profile 54 | **/ios/**/xcuserdata 55 | **/ios/.generated/ 56 | **/ios/Flutter/App.framework 57 | **/ios/Flutter/Flutter.framework 58 | **/ios/Flutter/Generated.xcconfig 59 | **/ios/Flutter/app.flx 60 | **/ios/Flutter/app.zip 61 | **/ios/Flutter/flutter_assets/ 62 | **/ios/ServiceDefinitions.json 63 | **/ios/Runner/GeneratedPluginRegistrant.* 64 | 65 | # Exceptions to above rules. 66 | !**/ios/**/default.mode1v3 67 | !**/ios/**/default.mode2v3 68 | !**/ios/**/default.pbxuser 69 | !**/ios/**/default.perspectivev3 70 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flutter_web_challenge_profile 2 | 3 | Use Flutter_web💪 to implement the UI challenge of Google Maps on [uplabs](https://www.uplabs.com/posts/google-maps-redesign-919dd0d6-0883-4378-b5b2-f77e36adb6b5) . 4 | 5 | [中文版本](README_CN.md) 6 | 7 | > Designer : [cassian.design](https://www.uplabs.com/cassian) 8 | > 9 | > Uplabs : 10 | > 11 | > Developer : [ditclear](https://github.com/ditclear) 12 | 13 | ### Run 14 | 15 | First, make sure the relevant environment is installed, please refer to [Flutter-web](https://github.com/flutter/flutter_web). 16 | 17 | Then clone 18 | 19 | > git clone https://github.com/flutter-ui-challenges/flutter_web_challenge_googlemaps.git 20 | 21 | You can open the project with Android Studio, IntelliJ or Visual Studio Code and run the `main.dart` file. 22 | 23 | ### Challenge 24 | 25 | 26 | 27 | ![](ui/preview.png) 28 | 29 | ![](ui/attachment.png) 30 | 31 | ### License 32 | 33 | ``` 34 | Copyright 2019 ditclear 35 | 36 | Licensed under the Apache License, Version 2.0 (the "License"); 37 | you may not use this file except in compliance with the License. 38 | You may obtain a copy of the License at 39 | 40 | http://www.apache.org/licenses/LICENSE-2.0 41 | 42 | Unless required by applicable law or agreed to in writing, software 43 | distributed under the License is distributed on an "AS IS" BASIS, 44 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 45 | See the License for the specific language governing permissions and 46 | limitations under the License. 47 | ``` 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /lib/view/profile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_web/material.dart'; 2 | import 'package:flutter_web_challenge_profile/helper/ui_helper.dart'; 3 | 4 | class ProfilePage extends StatefulWidget { 5 | @override 6 | State createState() { 7 | return _ProfileState(); 8 | } 9 | } 10 | 11 | class _ProfileState extends State { 12 | @override 13 | Widget build(BuildContext context) { 14 | screenWidth = MediaQuery.of(context).size.width; 15 | screenHeight = MediaQuery.of(context).size.height; 16 | return Material( 17 | child: Scaffold( 18 | body: DefaultTextStyle( 19 | style: TextStyle( 20 | fontFamily: 'Poppins', color: Colors.black, fontSize: realW(13)), 21 | child: Container( 22 | width: screenWidth, 23 | height: screenHeight, 24 | child: Row( 25 | children: [ 26 | Container( 27 | width: realW(314), 28 | height: double.infinity, 29 | child: Column( 30 | crossAxisAlignment: CrossAxisAlignment.start, 31 | children: [ 32 | Padding( 33 | padding: EdgeInsets.fromLTRB( 34 | realW(93), realH(35), 0, realH(110)), 35 | child: Icon( 36 | Icons.menu, 37 | size: realW(24), 38 | color: Colors.grey, 39 | ), 40 | ), 41 | Padding( 42 | padding: 43 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 44 | child: GestureDetector( 45 | onTap: () { 46 | Navigator.of(context).pop(); 47 | }, 48 | child: Text( 49 | "ABOUT ME", 50 | ), 51 | ), 52 | ), 53 | Padding( 54 | padding: 55 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 56 | child: Text( 57 | "PORTFOLIO", 58 | style: 59 | TextStyle(decoration: TextDecoration.underline), 60 | ), 61 | ), 62 | Padding( 63 | padding: 64 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 65 | child: Text( 66 | "MEMBERS", 67 | ), 68 | ), 69 | Padding( 70 | padding: 71 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 72 | child: Text( 73 | "CONTACT", 74 | ), 75 | ), 76 | ], 77 | ), 78 | ), 79 | Container( 80 | width: realW(315), 81 | height: double.infinity, 82 | child: SingleChildScrollView( 83 | child: Column( 84 | mainAxisSize: MainAxisSize.max, 85 | crossAxisAlignment: CrossAxisAlignment.start, 86 | children: [ 87 | Padding( 88 | padding: EdgeInsets.only( 89 | top: realH(166), bottom: realH(13)), 90 | child: Text( 91 | 'JAMES CHARLETON', 92 | style: TextStyle(fontSize: realW(15)), 93 | ), 94 | ), 95 | Hero( 96 | tag: "tag", 97 | child: Padding( 98 | padding: EdgeInsets.only(bottom: realH(13)), 99 | child: Text( 100 | 'PORTFILIO', 101 | style: TextStyle(fontSize: realW(50)), 102 | ), 103 | ), 104 | ), 105 | Padding( 106 | padding: EdgeInsets.only(bottom: realH(10)), 107 | child: Hero( 108 | tag: 'image', 109 | child: Image.asset( 110 | index % 2 == 0 111 | ? 'crystal-shaw-515211-unsplash.png' 112 | : 'joshua-rawson-harris-495411-unsplash.png', 113 | width: realW(232), 114 | height: realH(287), 115 | fit: BoxFit.fill, 116 | alignment: Alignment.topLeft, 117 | ))), 118 | Hero( 119 | tag: 'desc', 120 | child: Material( 121 | child: Container( 122 | width: realW(263), 123 | color: Colors.transparent, 124 | padding: EdgeInsets.only(bottom: realH(10)), 125 | child: Text( 126 | """ 127 | Hi my name is cassian I'm a UI/UX designer 128 | I've beem designing for about 3 years now 129 | I love working with creative individuals that 130 | can bring strong critique as well as laugh at 131 | latest meme 132 | """, 133 | style: TextStyle( 134 | fontSize: realW(12), 135 | height: realH(2), 136 | ), 137 | ), 138 | ), 139 | ), 140 | ), 141 | Padding( 142 | padding: EdgeInsets.only(top: realH(12.0)), 143 | child: Hero( 144 | tag: 'hire', 145 | child: FlatButton( 146 | color: const Color(0xff03E691), 147 | onPressed: () {}, 148 | child: Container( 149 | width: realW(214), 150 | height: realH(43), 151 | alignment: Alignment.center, 152 | child: Text( 153 | 'HIRE ME', 154 | style: TextStyle( 155 | fontFamily: 'Montserrat', 156 | color: Colors.white, 157 | fontSize: realW(13)), 158 | )), 159 | ), 160 | ), 161 | ) 162 | ], 163 | ), 164 | ), 165 | ), 166 | Container( 167 | width: realW(461), 168 | child: SingleChildScrollView( 169 | child: Column( 170 | crossAxisAlignment: CrossAxisAlignment.start, 171 | children: [ 172 | Padding( 173 | padding: EdgeInsets.only(top: realH(176), bottom: realH(57)), 174 | child: Image.asset( 175 | 'iPhoneXxc.png', 176 | width: double.infinity, 177 | height: realH(445), 178 | fit: BoxFit.fill, 179 | ), 180 | ), 181 | Image.asset( 182 | 'Statusdark.png', 183 | height: realH(222), 184 | width: double.infinity, 185 | fit: BoxFit.fitWidth, 186 | ), 187 | ], 188 | ), 189 | ), 190 | ), 191 | Container( 192 | width: realW(310), 193 | height: double.infinity, 194 | padding: EdgeInsets.only(left: realW(28)), 195 | child: SingleChildScrollView( 196 | child: Column( 197 | crossAxisAlignment: CrossAxisAlignment.start, 198 | children: [ 199 | Padding( 200 | padding: EdgeInsets.only( 201 | left: realW(200), 202 | top: realH(43), 203 | bottom: realH(80)), 204 | child: Hero( 205 | tag: 'search', 206 | child: Material( 207 | child: IconButton( 208 | onPressed: null, 209 | icon: Icon( 210 | Icons.search, 211 | size: realW(24), 212 | ), 213 | ), 214 | ), 215 | ), 216 | ), 217 | Padding( 218 | padding: EdgeInsets.only(bottom: realH(34)), 219 | child: Text( 220 | """DRIBBLE REDESIGN 221 | 222 | made much more easier to use with 223 | more features, the ui is do good you 224 | can take your eye off the app layout 225 | can be changed from grid to list, 2 226 | different accounts business account 227 | or just a normal one...….read more 228 | 229 | Colors 230 | """, 231 | style: TextStyle( 232 | fontSize: realW(11), 233 | height: 1.75, 234 | letterSpacing: 1.5), 235 | ), 236 | ), 237 | Padding( 238 | padding: EdgeInsets.only(bottom: realH(34)), 239 | child: Image.asset( 240 | "group.png", 241 | ), 242 | ), 243 | Padding( 244 | padding: EdgeInsets.only(bottom: realH(13)), 245 | child: Image.asset('ide.png'), 246 | ), 247 | Padding( 248 | padding: EdgeInsets.only(bottom: realH(34)), 249 | child: Text( 250 | """DRIBBLE REDESIGN 251 | 252 | user profile, dark mode an light mode 253 | the ui is simple and easy to use, attractive 254 | colors to win the users attention the 255 | inspiration of this design drawn from the 256 | new Facebook messenger ui…...read more 257 | 258 | 259 | Colors 260 | """, 261 | style: TextStyle( 262 | fontSize: realW(11), 263 | height: 1.75, 264 | letterSpacing: 1.5), 265 | ), 266 | ), 267 | Padding( 268 | padding: EdgeInsets.only(bottom: realH(34)), 269 | child: Image.asset( 270 | "group.png", 271 | ), 272 | ), 273 | Padding( 274 | padding: EdgeInsets.only(bottom: realH(13)), 275 | child: Image.asset('ide.png'), 276 | ), 277 | ], 278 | ), 279 | ), 280 | ), 281 | ], 282 | ), 283 | ), 284 | ), 285 | ), 286 | ); 287 | } 288 | } 289 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile 3 | packages: 4 | analyzer: 5 | dependency: transitive 6 | description: 7 | name: analyzer 8 | url: "https://pub.flutter-io.cn" 9 | source: hosted 10 | version: "0.36.3" 11 | archive: 12 | dependency: transitive 13 | description: 14 | name: archive 15 | url: "https://pub.flutter-io.cn" 16 | source: hosted 17 | version: "2.0.9" 18 | args: 19 | dependency: transitive 20 | description: 21 | name: args 22 | url: "https://pub.flutter-io.cn" 23 | source: hosted 24 | version: "1.5.2" 25 | async: 26 | dependency: transitive 27 | description: 28 | name: async 29 | url: "https://pub.flutter-io.cn" 30 | source: hosted 31 | version: "2.1.0" 32 | bazel_worker: 33 | dependency: transitive 34 | description: 35 | name: bazel_worker 36 | url: "https://pub.flutter-io.cn" 37 | source: hosted 38 | version: "0.1.21" 39 | boolean_selector: 40 | dependency: transitive 41 | description: 42 | name: boolean_selector 43 | url: "https://pub.flutter-io.cn" 44 | source: hosted 45 | version: "1.0.4" 46 | build: 47 | dependency: transitive 48 | description: 49 | name: build 50 | url: "https://pub.flutter-io.cn" 51 | source: hosted 52 | version: "1.1.4" 53 | build_config: 54 | dependency: transitive 55 | description: 56 | name: build_config 57 | url: "https://pub.flutter-io.cn" 58 | source: hosted 59 | version: "0.4.0" 60 | build_daemon: 61 | dependency: transitive 62 | description: 63 | name: build_daemon 64 | url: "https://pub.flutter-io.cn" 65 | source: hosted 66 | version: "1.0.0" 67 | build_modules: 68 | dependency: transitive 69 | description: 70 | name: build_modules 71 | url: "https://pub.flutter-io.cn" 72 | source: hosted 73 | version: "2.3.0" 74 | build_resolvers: 75 | dependency: transitive 76 | description: 77 | name: build_resolvers 78 | url: "https://pub.flutter-io.cn" 79 | source: hosted 80 | version: "1.0.5" 81 | build_runner: 82 | dependency: "direct dev" 83 | description: 84 | name: build_runner 85 | url: "https://pub.flutter-io.cn" 86 | source: hosted 87 | version: "1.5.1" 88 | build_runner_core: 89 | dependency: transitive 90 | description: 91 | name: build_runner_core 92 | url: "https://pub.flutter-io.cn" 93 | source: hosted 94 | version: "3.0.6" 95 | build_web_compilers: 96 | dependency: "direct dev" 97 | description: 98 | name: build_web_compilers 99 | url: "https://pub.flutter-io.cn" 100 | source: hosted 101 | version: "2.1.0" 102 | built_collection: 103 | dependency: transitive 104 | description: 105 | name: built_collection 106 | url: "https://pub.flutter-io.cn" 107 | source: hosted 108 | version: "4.2.2" 109 | built_value: 110 | dependency: transitive 111 | description: 112 | name: built_value 113 | url: "https://pub.flutter-io.cn" 114 | source: hosted 115 | version: "6.6.0" 116 | charcode: 117 | dependency: transitive 118 | description: 119 | name: charcode 120 | url: "https://pub.flutter-io.cn" 121 | source: hosted 122 | version: "1.1.2" 123 | code_builder: 124 | dependency: transitive 125 | description: 126 | name: code_builder 127 | url: "https://pub.flutter-io.cn" 128 | source: hosted 129 | version: "3.2.0" 130 | collection: 131 | dependency: transitive 132 | description: 133 | name: collection 134 | url: "https://pub.flutter-io.cn" 135 | source: hosted 136 | version: "1.14.11" 137 | convert: 138 | dependency: transitive 139 | description: 140 | name: convert 141 | url: "https://pub.flutter-io.cn" 142 | source: hosted 143 | version: "2.1.1" 144 | crypto: 145 | dependency: transitive 146 | description: 147 | name: crypto 148 | url: "https://pub.flutter-io.cn" 149 | source: hosted 150 | version: "2.0.6" 151 | csslib: 152 | dependency: transitive 153 | description: 154 | name: csslib 155 | url: "https://pub.flutter-io.cn" 156 | source: hosted 157 | version: "0.16.0" 158 | dart_style: 159 | dependency: transitive 160 | description: 161 | name: dart_style 162 | url: "https://pub.flutter-io.cn" 163 | source: hosted 164 | version: "1.2.7" 165 | fixnum: 166 | dependency: transitive 167 | description: 168 | name: fixnum 169 | url: "https://pub.flutter-io.cn" 170 | source: hosted 171 | version: "0.10.9" 172 | flutter_web: 173 | dependency: "direct main" 174 | description: 175 | path: "packages/flutter_web" 176 | ref: HEAD 177 | resolved-ref: "69acfd97c5a7bf0605e9a01df7749716ceb1707f" 178 | url: "https://github.com/flutter/flutter_web" 179 | source: git 180 | version: "0.0.0" 181 | flutter_web_test: 182 | dependency: "direct overridden" 183 | description: 184 | path: "packages/flutter_web_test" 185 | ref: HEAD 186 | resolved-ref: "69acfd97c5a7bf0605e9a01df7749716ceb1707f" 187 | url: "https://github.com/flutter/flutter_web" 188 | source: git 189 | version: "0.0.0" 190 | flutter_web_ui: 191 | dependency: "direct main" 192 | description: 193 | path: "packages/flutter_web_ui" 194 | ref: HEAD 195 | resolved-ref: "69acfd97c5a7bf0605e9a01df7749716ceb1707f" 196 | url: "https://github.com/flutter/flutter_web" 197 | source: git 198 | version: "0.0.0" 199 | front_end: 200 | dependency: transitive 201 | description: 202 | name: front_end 203 | url: "https://pub.flutter-io.cn" 204 | source: hosted 205 | version: "0.1.18" 206 | glob: 207 | dependency: transitive 208 | description: 209 | name: glob 210 | url: "https://pub.flutter-io.cn" 211 | source: hosted 212 | version: "1.1.7" 213 | graphs: 214 | dependency: transitive 215 | description: 216 | name: graphs 217 | url: "https://pub.flutter-io.cn" 218 | source: hosted 219 | version: "0.2.0" 220 | html: 221 | dependency: transitive 222 | description: 223 | name: html 224 | url: "https://pub.flutter-io.cn" 225 | source: hosted 226 | version: "0.14.0+2" 227 | http: 228 | dependency: transitive 229 | description: 230 | name: http 231 | url: "https://pub.flutter-io.cn" 232 | source: hosted 233 | version: "0.12.0+2" 234 | http_multi_server: 235 | dependency: transitive 236 | description: 237 | name: http_multi_server 238 | url: "https://pub.flutter-io.cn" 239 | source: hosted 240 | version: "2.1.0" 241 | http_parser: 242 | dependency: transitive 243 | description: 244 | name: http_parser 245 | url: "https://pub.flutter-io.cn" 246 | source: hosted 247 | version: "3.1.3" 248 | intl: 249 | dependency: transitive 250 | description: 251 | name: intl 252 | url: "https://pub.flutter-io.cn" 253 | source: hosted 254 | version: "0.15.8" 255 | io: 256 | dependency: transitive 257 | description: 258 | name: io 259 | url: "https://pub.flutter-io.cn" 260 | source: hosted 261 | version: "0.3.3" 262 | js: 263 | dependency: transitive 264 | description: 265 | name: js 266 | url: "https://pub.flutter-io.cn" 267 | source: hosted 268 | version: "0.6.1+1" 269 | json_annotation: 270 | dependency: transitive 271 | description: 272 | name: json_annotation 273 | url: "https://pub.flutter-io.cn" 274 | source: hosted 275 | version: "2.4.0" 276 | json_rpc_2: 277 | dependency: transitive 278 | description: 279 | name: json_rpc_2 280 | url: "https://pub.flutter-io.cn" 281 | source: hosted 282 | version: "2.1.0" 283 | kernel: 284 | dependency: transitive 285 | description: 286 | name: kernel 287 | url: "https://pub.flutter-io.cn" 288 | source: hosted 289 | version: "0.3.18" 290 | logging: 291 | dependency: transitive 292 | description: 293 | name: logging 294 | url: "https://pub.flutter-io.cn" 295 | source: hosted 296 | version: "0.11.3+2" 297 | matcher: 298 | dependency: transitive 299 | description: 300 | name: matcher 301 | url: "https://pub.flutter-io.cn" 302 | source: hosted 303 | version: "0.12.5" 304 | meta: 305 | dependency: transitive 306 | description: 307 | name: meta 308 | url: "https://pub.flutter-io.cn" 309 | source: hosted 310 | version: "1.1.6" 311 | mime: 312 | dependency: transitive 313 | description: 314 | name: mime 315 | url: "https://pub.flutter-io.cn" 316 | source: hosted 317 | version: "0.9.6+3" 318 | multi_server_socket: 319 | dependency: transitive 320 | description: 321 | name: multi_server_socket 322 | url: "https://pub.flutter-io.cn" 323 | source: hosted 324 | version: "1.0.2" 325 | node_preamble: 326 | dependency: transitive 327 | description: 328 | name: node_preamble 329 | url: "https://pub.flutter-io.cn" 330 | source: hosted 331 | version: "1.4.4" 332 | package_config: 333 | dependency: transitive 334 | description: 335 | name: package_config 336 | url: "https://pub.flutter-io.cn" 337 | source: hosted 338 | version: "1.0.5" 339 | package_resolver: 340 | dependency: transitive 341 | description: 342 | name: package_resolver 343 | url: "https://pub.flutter-io.cn" 344 | source: hosted 345 | version: "1.0.10" 346 | path: 347 | dependency: transitive 348 | description: 349 | name: path 350 | url: "https://pub.flutter-io.cn" 351 | source: hosted 352 | version: "1.6.2" 353 | pedantic: 354 | dependency: transitive 355 | description: 356 | name: pedantic 357 | url: "https://pub.flutter-io.cn" 358 | source: hosted 359 | version: "1.5.0" 360 | pool: 361 | dependency: transitive 362 | description: 363 | name: pool 364 | url: "https://pub.flutter-io.cn" 365 | source: hosted 366 | version: "1.4.0" 367 | protobuf: 368 | dependency: transitive 369 | description: 370 | name: protobuf 371 | url: "https://pub.flutter-io.cn" 372 | source: hosted 373 | version: "0.13.12" 374 | pub_semver: 375 | dependency: transitive 376 | description: 377 | name: pub_semver 378 | url: "https://pub.flutter-io.cn" 379 | source: hosted 380 | version: "1.4.2" 381 | pubspec_parse: 382 | dependency: transitive 383 | description: 384 | name: pubspec_parse 385 | url: "https://pub.flutter-io.cn" 386 | source: hosted 387 | version: "0.1.4" 388 | quiver: 389 | dependency: transitive 390 | description: 391 | name: quiver 392 | url: "https://pub.flutter-io.cn" 393 | source: hosted 394 | version: "2.0.2" 395 | scratch_space: 396 | dependency: transitive 397 | description: 398 | name: scratch_space 399 | url: "https://pub.flutter-io.cn" 400 | source: hosted 401 | version: "0.0.3+2" 402 | shelf: 403 | dependency: transitive 404 | description: 405 | name: shelf 406 | url: "https://pub.flutter-io.cn" 407 | source: hosted 408 | version: "0.7.5" 409 | shelf_packages_handler: 410 | dependency: transitive 411 | description: 412 | name: shelf_packages_handler 413 | url: "https://pub.flutter-io.cn" 414 | source: hosted 415 | version: "1.0.4" 416 | shelf_static: 417 | dependency: transitive 418 | description: 419 | name: shelf_static 420 | url: "https://pub.flutter-io.cn" 421 | source: hosted 422 | version: "0.2.8" 423 | shelf_web_socket: 424 | dependency: transitive 425 | description: 426 | name: shelf_web_socket 427 | url: "https://pub.flutter-io.cn" 428 | source: hosted 429 | version: "0.2.3" 430 | source_map_stack_trace: 431 | dependency: transitive 432 | description: 433 | name: source_map_stack_trace 434 | url: "https://pub.flutter-io.cn" 435 | source: hosted 436 | version: "1.1.5" 437 | source_maps: 438 | dependency: transitive 439 | description: 440 | name: source_maps 441 | url: "https://pub.flutter-io.cn" 442 | source: hosted 443 | version: "0.10.8" 444 | source_span: 445 | dependency: transitive 446 | description: 447 | name: source_span 448 | url: "https://pub.flutter-io.cn" 449 | source: hosted 450 | version: "1.5.5" 451 | stack_trace: 452 | dependency: transitive 453 | description: 454 | name: stack_trace 455 | url: "https://pub.flutter-io.cn" 456 | source: hosted 457 | version: "1.9.3" 458 | stream_channel: 459 | dependency: transitive 460 | description: 461 | name: stream_channel 462 | url: "https://pub.flutter-io.cn" 463 | source: hosted 464 | version: "2.0.0" 465 | stream_transform: 466 | dependency: transitive 467 | description: 468 | name: stream_transform 469 | url: "https://pub.flutter-io.cn" 470 | source: hosted 471 | version: "0.0.19" 472 | string_scanner: 473 | dependency: transitive 474 | description: 475 | name: string_scanner 476 | url: "https://pub.flutter-io.cn" 477 | source: hosted 478 | version: "1.0.4" 479 | term_glyph: 480 | dependency: transitive 481 | description: 482 | name: term_glyph 483 | url: "https://pub.flutter-io.cn" 484 | source: hosted 485 | version: "1.1.0" 486 | test: 487 | dependency: transitive 488 | description: 489 | name: test 490 | url: "https://pub.flutter-io.cn" 491 | source: hosted 492 | version: "1.6.4" 493 | test_api: 494 | dependency: transitive 495 | description: 496 | name: test_api 497 | url: "https://pub.flutter-io.cn" 498 | source: hosted 499 | version: "0.2.6" 500 | test_core: 501 | dependency: transitive 502 | description: 503 | name: test_core 504 | url: "https://pub.flutter-io.cn" 505 | source: hosted 506 | version: "0.2.6" 507 | timing: 508 | dependency: transitive 509 | description: 510 | name: timing 511 | url: "https://pub.flutter-io.cn" 512 | source: hosted 513 | version: "0.1.1+1" 514 | typed_data: 515 | dependency: transitive 516 | description: 517 | name: typed_data 518 | url: "https://pub.flutter-io.cn" 519 | source: hosted 520 | version: "1.1.6" 521 | vector_math: 522 | dependency: transitive 523 | description: 524 | name: vector_math 525 | url: "https://pub.flutter-io.cn" 526 | source: hosted 527 | version: "2.0.8" 528 | vm_service_client: 529 | dependency: transitive 530 | description: 531 | name: vm_service_client 532 | url: "https://pub.flutter-io.cn" 533 | source: hosted 534 | version: "0.2.6+2" 535 | watcher: 536 | dependency: transitive 537 | description: 538 | name: watcher 539 | url: "https://pub.flutter-io.cn" 540 | source: hosted 541 | version: "0.9.7+10" 542 | web_socket_channel: 543 | dependency: transitive 544 | description: 545 | name: web_socket_channel 546 | url: "https://pub.flutter-io.cn" 547 | source: hosted 548 | version: "1.0.13" 549 | yaml: 550 | dependency: transitive 551 | description: 552 | name: yaml 553 | url: "https://pub.flutter-io.cn" 554 | source: hosted 555 | version: "2.1.15" 556 | sdks: 557 | dart: ">=2.3.0-dev.0.1 <3.0.0" 558 | -------------------------------------------------------------------------------- /lib/view/about.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | import 'package:flutter_web/animation.dart'; 4 | import 'package:flutter_web/material.dart'; 5 | import 'package:flutter_web_challenge_profile/helper/ui_helper.dart'; 6 | import 'package:flutter_web_challenge_profile/view/profile.dart'; 7 | 8 | class AboutPage extends StatefulWidget { 9 | @override 10 | State createState() { 11 | return _AboutState(); 12 | } 13 | } 14 | 15 | class _AboutState extends State with TickerProviderStateMixin { 16 | AnimationController controller; 17 | Animation animation; 18 | 19 | @override 20 | void initState() { 21 | super.initState(); 22 | controller = 23 | AnimationController(vsync: this, duration: Duration(milliseconds: 300)); 24 | animation = Tween(begin: 0.0, end: 762.0).animate(controller) 25 | ..addListener(() { 26 | setState(() {}); 27 | }) 28 | ..addStatusListener((status) { 29 | if (status == AnimationStatus.completed) { 30 | index = (index + 1) % 2; 31 | controller.reverse(); 32 | } 33 | }); 34 | } 35 | 36 | @override 37 | Widget build(BuildContext context) { 38 | screenWidth = MediaQuery.of(context).size.width; 39 | screenHeight = MediaQuery.of(context).size.height; 40 | return Material( 41 | child: Scaffold( 42 | body: DefaultTextStyle( 43 | style: TextStyle( 44 | fontFamily: 'Poppins', color: Colors.black, fontSize: realW(13)), 45 | child: Container( 46 | width: screenWidth, 47 | height: screenHeight, 48 | padding: const EdgeInsets.all(0), 49 | child: Row( 50 | children: [ 51 | Container( 52 | width: realW(314), 53 | height: double.infinity, 54 | child: Column( 55 | crossAxisAlignment: CrossAxisAlignment.start, 56 | children: [ 57 | Padding( 58 | padding: EdgeInsets.fromLTRB( 59 | realW(93), realH(35), 0, realH(110)), 60 | child: Icon( 61 | Icons.menu, 62 | size: realW(24), 63 | color: Colors.grey, 64 | ), 65 | ), 66 | Padding( 67 | padding: 68 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 69 | child: Text( 70 | "ABOUT ME", 71 | style: 72 | TextStyle(decoration: TextDecoration.underline), 73 | ), 74 | ), 75 | Padding( 76 | padding: 77 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 78 | child: GestureDetector( 79 | onTap: () { 80 | Navigator.of(context) 81 | .push(FadeRoute(page: ProfilePage())); 82 | }, 83 | child: Text( 84 | "PORTFOLIO", 85 | ), 86 | ), 87 | ), 88 | Padding( 89 | padding: 90 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 91 | child: Text( 92 | "MEMBERS", 93 | ), 94 | ), 95 | Padding( 96 | padding: 97 | EdgeInsets.only(left: realW(93), bottom: realH(34)), 98 | child: Text( 99 | "CONTACT", 100 | ), 101 | ), 102 | Padding( 103 | padding: 104 | EdgeInsets.only(left: realW(115), bottom: realH(34)), 105 | child: Container( 106 | width: realW(2), 107 | height: realH(100), 108 | alignment: Alignment.topCenter, 109 | color: Color(0xFFC8C1C1).withOpacity(0.38), 110 | child: Transform.translate( 111 | offset: Offset(0, realH(index * 50.0)), 112 | child: Container( 113 | width: realW(2), 114 | height: realH(50), 115 | color: Colors.black), 116 | ), 117 | ), 118 | ), 119 | Padding( 120 | padding: 121 | EdgeInsets.only(left: realW(106), bottom: realH(34)), 122 | child: Text( 123 | "${index + 1}-2", 124 | ), 125 | ), 126 | ], 127 | ), 128 | ), 129 | Container( 130 | width: realW(355), 131 | height: double.infinity, 132 | child: SingleChildScrollView( 133 | child: Column( 134 | crossAxisAlignment: CrossAxisAlignment.start, 135 | children: [ 136 | Padding( 137 | padding: EdgeInsets.only( 138 | top: realH(166), bottom: realH(13)), 139 | child: Text( 140 | 'JAMES CHARLETON', 141 | style: TextStyle(fontSize: realW(15)), 142 | ), 143 | ), 144 | Padding( 145 | padding: EdgeInsets.only(bottom: realH(13)), 146 | child: Text( 147 | 'ABOUT ME', 148 | style: TextStyle(fontSize: realW(50)), 149 | ), 150 | ), 151 | Hero( 152 | tag: 'desc', 153 | child: Material( 154 | child: Container( 155 | color: Colors.transparent, 156 | width: realW(263), 157 | padding: EdgeInsets.only(bottom: realH(10)), 158 | child: Text( 159 | """ 160 | Hi my name is cassian I'm a UI/UX designer 161 | I've beem designing for about 3 years now 162 | I love working with creative individuals that 163 | can bring strong critique as well as laugh at 164 | latest meme 165 | """, 166 | style: TextStyle( 167 | fontSize: realW(12), height: realH(2)), 168 | ), 169 | ), 170 | ), 171 | ), 172 | Padding( 173 | padding: EdgeInsets.only( 174 | bottom: realH(31), 175 | ), 176 | child: Text( 177 | 'SUBSCRIBE TO OUR NEWSLETTER', 178 | style: TextStyle( 179 | decoration: TextDecoration.underline, 180 | fontSize: realW(11)), 181 | ), 182 | ), 183 | Padding( 184 | padding: EdgeInsets.only( 185 | bottom: realH(12), 186 | ), 187 | child: Text( 188 | 'EXPERIENCE', 189 | style: TextStyle(fontFamily: 'Montserrat'), 190 | ), 191 | ), 192 | Padding( 193 | padding: EdgeInsets.only( 194 | bottom: realH(9), 195 | ), 196 | child: Text( 197 | '2016 to present PayPay inc.', 198 | style: TextStyle( 199 | fontFamily: 'Montserrat', fontSize: realW(13)), 200 | ), 201 | ), 202 | Padding( 203 | padding: EdgeInsets.only( 204 | bottom: realH(13), 205 | ), 206 | child: Text( 207 | 'Sr. User experience designer, Foundations', 208 | style: TextStyle( 209 | fontFamily: 'Montserrat', 210 | fontSize: realW(12), 211 | color: Color(0xff707070)), 212 | ), 213 | ), 214 | Padding( 215 | padding: EdgeInsets.only( 216 | bottom: realH(11), 217 | ), 218 | child: Text( 219 | 'PROJECTS', 220 | style: TextStyle( 221 | fontFamily: 'Montserrat', fontSize: realW(11)), 222 | ), 223 | ), 224 | Padding( 225 | padding: EdgeInsets.only( 226 | bottom: realH(12), left: realW(42)), 227 | child: Text( 228 | """ 229 | Establishing design system artifacts and 230 | processes to improve design across the 231 | rage of product design 232 | """, 233 | style: TextStyle(fontSize: realW(11)), 234 | ), 235 | ), 236 | Padding( 237 | padding: EdgeInsets.all(0), 238 | child: Image.asset( 239 | index % 2 == 0 ? 'Unisa.png' : 'Pinterest.png'), 240 | ) 241 | ], 242 | ), 243 | ), 244 | ), 245 | Container( 246 | width: realW(533), 247 | height: double.infinity, 248 | child: SingleChildScrollView( 249 | child: Column( 250 | crossAxisAlignment: CrossAxisAlignment.start, 251 | mainAxisAlignment: MainAxisAlignment.start, 252 | children: [ 253 | Stack( 254 | children: [ 255 | Hero( 256 | tag: 'image', 257 | child: GestureDetector( 258 | onTap: () { 259 | if (animation.value == 0) { 260 | controller.forward(); 261 | } 262 | }, 263 | child: Image.asset( 264 | index % 2 == 0 265 | ? 'crystal-shaw-515211-unsplash.png' 266 | : 'joshua-rawson-harris-495411-unsplash.png', 267 | width: realW(533), 268 | height: realH(762), 269 | fit: BoxFit.fill, 270 | ), 271 | )), 272 | Container( 273 | width: realW(533), 274 | height: realH(animation.value), 275 | decoration: BoxDecoration( 276 | color: Colors.black 277 | .withOpacity(animation.value / 762.0)), 278 | ), 279 | ], 280 | ), 281 | Padding( 282 | padding: EdgeInsets.only(top: realH(29.0)), 283 | child: Hero( 284 | tag: 'hire', 285 | child: FlatButton( 286 | color: const Color(0xff03E691), 287 | onPressed: () {}, 288 | child: Container( 289 | width: realW(214), 290 | height: realH(43), 291 | alignment: Alignment.center, 292 | child: Text( 293 | 'HIRE ME', 294 | style: TextStyle( 295 | fontFamily: 'Montserrat', 296 | color: Colors.white, 297 | fontSize: realW(13)), 298 | )), 299 | ), 300 | ), 301 | ) 302 | ], 303 | ), 304 | ), 305 | ), 306 | Container( 307 | width: realW(198), 308 | height: double.infinity, 309 | child: Column( 310 | crossAxisAlignment: CrossAxisAlignment.start, 311 | children: [ 312 | Padding( 313 | padding: EdgeInsets.only( 314 | left: realW(103), 315 | top: realH(39), 316 | bottom: realH(604)), 317 | child: Hero( 318 | tag: 'search', 319 | child: Material( 320 | child: IconButton( 321 | onPressed: null, 322 | icon: Icon( 323 | Icons.search, 324 | size: realW(24), 325 | ), 326 | ), 327 | ), 328 | ), 329 | ), 330 | Padding( 331 | padding: 332 | EdgeInsets.only(left: realW(70), bottom: realH(34)), 333 | child: Text( 334 | "RESUME", 335 | ), 336 | ), 337 | Padding( 338 | padding: 339 | EdgeInsets.only(left: realW(70), bottom: realH(34)), 340 | child: Text( 341 | "LINKDIN", 342 | ), 343 | ), 344 | Padding( 345 | padding: 346 | EdgeInsets.only(left: realW(70), bottom: realH(34)), 347 | child: Text( 348 | "MEDIUM", 349 | ), 350 | ), 351 | ], 352 | ), 353 | ), 354 | ], 355 | ), 356 | ), 357 | ), 358 | ), 359 | ); 360 | } 361 | } 362 | 363 | class FadeRoute extends PageRouteBuilder { 364 | final Widget page; 365 | @override 366 | Duration get transitionDuration => const Duration(milliseconds: 800); 367 | 368 | FadeRoute({this.page}) 369 | : super( 370 | pageBuilder: ( 371 | BuildContext context, 372 | Animation animation, 373 | Animation secondaryAnimation, 374 | ) => 375 | page, 376 | transitionsBuilder: ( 377 | BuildContext context, 378 | Animation animation, 379 | Animation secondaryAnimation, 380 | Widget child, 381 | ) => 382 | FadeTransition( 383 | opacity: animation, 384 | child: child, 385 | ), 386 | ); 387 | } 388 | --------------------------------------------------------------------------------