diff --git a/.gitignore b/.gitignore index 29a3a50..7dbd97a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,5 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release +ios +.metadata diff --git a/README.md b/README.md index 48908b7..1dd21df 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,90 @@ # flutter_start -A new Flutter project. +Flutter_start is a package that allows you to jumpstart your application with a splashScreen, introduction and a home. -## Getting Started +## Setup -This project is a starting point for a Flutter application. +To use this package, add flutter_start as a dependency in your pubspec.yaml file: -A few resources to get you started if this is your first Flutter project: +``` + flutter_start: + git: + url: https://github.com/Iconica-Development/flutter_start + ref: +``` -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) +To use the module within your Flutter-application with predefined `Go_router` routes you should add the following: -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +Add go_router as dependency to your project. +Add the following configuration to your flutter_application: + +``` +StartUserStoryConfiguration startUserStoryConfiguration = const StartUserStoryConfiguration(); +``` + +and set the values as you wish. + +Next add the `StartUserStoryConfiguration` to `getStartStoryRoutes` Like so: + +``` +List getStartRoutes() => getStartStoryRoutes( + startUserStoryConfiguration, + ); +``` + +Finally add the `getStartRoutes` to your `Go_router` routes like so: + +``` +final GoRouter _router = GoRouter( + routes: [ + ...getStartRoutes() + ], +); +``` + +The routes that can be used to navigate are: + +For routing to the `SplashScreen`: + +``` + static const String splashScreen = '/splashScreen'; +``` + +For routing to the `Introduction`: + +``` + static const String introduction = '/introduction'; +``` + +For routing to the `HomeEntry`: + +``` + static const String home = '/home'; +``` + +If you don't want a SplashScreen in your application set your initialRoute to `Introduction`: + +``` +final GoRouter _router = GoRouter( + routes: [ + ...getStartRoutes() + ], + initialLocation: '/introduction', +); +``` + +To use the module within your Flutter-application without predefined `Go_router` routes but with `Navigator` routes add the following : + +Add the following configuration to your flutter_application: + +``` +StartUserStoryConfiguration startUserStoryConfiguration = const StartUserStoryConfiguration(); +``` + +Add the following code to the build-method of a chosen widget: + +``` +startNavigatorUserStory(startUserStoryConfiguration, context); +``` + +If the splashScreenBuilder is not used the SplashScreen will be skipped. diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/example/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..58c7201 --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,153 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_introduction_shared_preferences/flutter_introduction_shared_preferences.dart'; +import 'package:flutter_start/flutter_start.dart'; + +import 'package:go_router/go_router.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp( + home: Home(), + ); + } +} + +class Home extends StatelessWidget { + const Home({super.key}); + + @override + Widget build(BuildContext context) { + return startNavigatorUserStory(config, context); + } +} + +final GoRouter _router = GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (BuildContext context, GoRouterState state) { + return const Home(); + }, + ), + ...getStartRoutes() + ], +); + +List getStartRoutes() => getStartStoryRoutes( + config, + ); + +StartUserStoryConfiguration s = const StartUserStoryConfiguration(); +StartUserStoryConfiguration config = StartUserStoryConfiguration( + // showIntroduction: false, + splashScreenBuilder: (context, onFinish) => SplashScreen( + onFinish: onFinish, + ), + homeEntry: const HomeEntry(), + introductionOptions: IntroductionOptions( + pages: [ + IntroductionPage( + title: const Text('First page'), + text: const Text('Wow a page'), + graphic: const FlutterLogo(), + ), + IntroductionPage( + title: const Text('Second page'), + text: const Text('Another page'), + graphic: const FlutterLogo(), + ), + IntroductionPage( + title: const Text('Third page'), + text: const Text('The final page of this app'), + graphic: const FlutterLogo(), + ), + ], + introductionTranslations: const IntroductionTranslations( + skipButton: 'Skip it!', + nextButton: 'Next', + previousButton: 'Previous', + finishButton: 'To the app!', + ), + tapEnabled: true, + displayMode: IntroductionDisplayMode.multiPageHorizontal, + buttonMode: IntroductionScreenButtonMode.text, + indicatorMode: IndicatorMode.dash, + skippable: true, + buttonBuilder: (context, onPressed, child, type) => + ElevatedButton(onPressed: onPressed, child: child), + ), + introductionService: IntroductionService( + ExampleIntroductionDataProvider(), + ), +); + +class SplashScreen extends StatefulWidget { + const SplashScreen({ + required this.onFinish, + super.key, + }); + + final Function() onFinish; + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + Future.delayed(const Duration(seconds: 3), () { + widget.onFinish(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("SplashScreen"), + ), + body: const Center(child: Text("SplashScreen")), + ); + } +} + +class HomeEntry extends StatelessWidget { + const HomeEntry({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("HomeEntry"), + ), + body: const Center(child: Text("HomeEntry")), + ); + } +} + +class ExampleIntroductionDataProvider + implements SharedPreferencesIntroductionDataProvider { + @override + String key = 'example'; + + @override + Future setCompleted({bool value = true}) async { + // ignore: void_checks + return Future.value(false); + } + + @override + Future shouldShow() { + // ignore: void_checks + return Future.value(true); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 0000000..6822619 --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,551 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: a3ec2e0f967bc47f69f95009bb93db936288d61d5343b9436e378b28a2f830c6 + url: "https://pub.dev" + source: hosted + version: "8.9.0" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_data_interface: + dependency: transitive + description: + path: "." + ref: "1.0.0" + resolved-ref: "500ed1d08095b33387ae3aa4ed1a2ad4d2fb2ac3" + url: "https://github.com/Iconica-Development/flutter_data_interface.git" + source: git + version: "1.0.0" + flutter_introduction: + dependency: transitive + description: + path: "packages/flutter_introduction" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_interface: + dependency: transitive + description: + path: "packages/flutter_introduction_interface" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_service: + dependency: transitive + description: + path: "packages/flutter_introduction_service" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_shared_preferences: + dependency: "direct main" + description: + path: "packages/flutter_introduction_shared_preferences" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_widget: + dependency: transitive + description: + path: "packages/flutter_introduction_widget" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_start: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "1.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "3b40e751eaaa855179b416974d59d29669e750d2e50fcdb2b37f1cb0ca8c803a" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + url: "https://pub.dev" + source: hosted + version: "5.4.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.2.5 <4.0.0" + flutter: ">=3.16.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..e8c8065 --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,25 @@ +name: example +description: "A new Flutter project." +publish_to: "none" +environment: + sdk: ">=3.2.5 <4.0.0" +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.2 + go_router: ^13.0.1 + flutter_start: + path: ../ + flutter_introduction_shared_preferences: + git: + url: https://github.com/Iconica-Development/flutter_introduction + ref: 2.0.0 + path: packages/flutter_introduction_shared_preferences + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + +flutter: + uses-material-design: true diff --git a/lib/flutter_start.dart b/lib/flutter_start.dart new file mode 100644 index 0000000..0f7d905 --- /dev/null +++ b/lib/flutter_start.dart @@ -0,0 +1,4 @@ +export 'package:flutter_start/src/models/start_configuration.dart'; +export 'package:flutter_start/src/user_stories/flutter_start_userstory_go_router.dart'; +export 'package:flutter_start/src/user_stories/flutter_start_userstory_navigator.dart'; +export 'package:flutter_introduction/flutter_introduction.dart'; diff --git a/lib/main.dart b/lib/main.dart deleted file mode 100644 index 8e94089..0000000 --- a/lib/main.dart +++ /dev/null @@ -1,125 +0,0 @@ -import 'package:flutter/material.dart'; - -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} diff --git a/lib/src/go_router.dart b/lib/src/go_router.dart new file mode 100644 index 0000000..c9113db --- /dev/null +++ b/lib/src/go_router.dart @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +CustomTransitionPage buildScreenWithFadeTransition({ + required BuildContext context, + required GoRouterState state, + required Widget child, +}) => + CustomTransitionPage( + key: state.pageKey, + child: child, + transitionsBuilder: (context, animation, secondaryAnimation, child) => + FadeTransition(opacity: animation, child: child), + ); + +CustomTransitionPage buildScreenWithoutTransition({ + required BuildContext context, + required GoRouterState state, + required Widget child, +}) => + CustomTransitionPage( + key: state.pageKey, + child: child, + transitionsBuilder: (context, animation, secondaryAnimation, child) => + child, + ); diff --git a/lib/src/models/start_configuration.dart b/lib/src/models/start_configuration.dart new file mode 100644 index 0000000..1fa22d0 --- /dev/null +++ b/lib/src/models/start_configuration.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_introduction/flutter_introduction.dart'; + +@immutable +class StartUserStoryConfiguration { + const StartUserStoryConfiguration({ + this.splashScreenBuilder, + this.introductionOptions = const IntroductionOptions(), + this.introductionService, + this.homeEntry, + this.introductionFallbackScreen, + this.introductionScrollPhysics, + this.showIntroduction = true, + }); + final Widget Function( + BuildContext context, + Function() onFinish, + )? splashScreenBuilder; + + final Widget? homeEntry; + + final IntroductionOptions introductionOptions; + final Widget? introductionFallbackScreen; + final IntroductionService? introductionService; + final ScrollPhysics? introductionScrollPhysics; + final bool? showIntroduction; +} diff --git a/lib/src/routes.dart b/lib/src/routes.dart new file mode 100644 index 0000000..ad1bcb8 --- /dev/null +++ b/lib/src/routes.dart @@ -0,0 +1,5 @@ +mixin StartUserStoryRoutes { + static const String splashScreen = '/splashScreen'; + static const String introduction = '/introduction'; + static const String home = '/home'; +} diff --git a/lib/src/user_stories/flutter_start_userstory_go_router.dart b/lib/src/user_stories/flutter_start_userstory_go_router.dart new file mode 100644 index 0000000..d385619 --- /dev/null +++ b/lib/src/user_stories/flutter_start_userstory_go_router.dart @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: 2023 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + +import 'package:flutter/material.dart'; +import 'package:flutter_introduction/flutter_introduction.dart'; +import 'package:flutter_start/src/go_router.dart'; +import 'package:flutter_start/src/models/start_configuration.dart'; +import 'package:flutter_start/src/routes.dart'; + +import 'package:go_router/go_router.dart'; + +List getStartStoryRoutes( + StartUserStoryConfiguration configuration, +) => + [ + GoRoute( + path: StartUserStoryRoutes.splashScreen, + pageBuilder: (context, state) { + return buildScreenWithoutTransition( + context: context, + state: state, + child: configuration.splashScreenBuilder?.call( + context, + () { + if (configuration.showIntroduction == false) { + return context.go(StartUserStoryRoutes.home); + } + return context.go(StartUserStoryRoutes.introduction); + }, + ) ?? + const Scaffold( + body: SizedBox.shrink(), + ), + ); + }, + ), + GoRoute( + path: StartUserStoryRoutes.introduction, + pageBuilder: (context, state) { + var introduction = Introduction( + service: configuration.introductionService, + navigateTo: () { + context.go(StartUserStoryRoutes.home); + }, + options: configuration.introductionOptions, + physics: configuration.introductionScrollPhysics, + child: configuration.introductionFallbackScreen, + ); + return buildScreenWithoutTransition( + context: context, + state: state, + child: Scaffold( + body: introduction, + ), + ); + }, + ), + GoRoute( + path: StartUserStoryRoutes.home, + pageBuilder: (context, state) { + var home = configuration.homeEntry; + return buildScreenWithoutTransition( + context: context, + state: state, + child: Scaffold( + body: home, + ), + ); + }, + ), + ]; diff --git a/lib/src/user_stories/flutter_start_userstory_navigator.dart b/lib/src/user_stories/flutter_start_userstory_navigator.dart new file mode 100644 index 0000000..ff580e1 --- /dev/null +++ b/lib/src/user_stories/flutter_start_userstory_navigator.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_start/flutter_start.dart'; + +Widget startNavigatorUserStory( + StartUserStoryConfiguration configuration, BuildContext context) { + if (configuration.splashScreenBuilder == null) { + return _introduction(configuration, context); + } + return _splashScreen(configuration, context); +} + +Widget _splashScreen( + StartUserStoryConfiguration configuration, + BuildContext context, +) { + return configuration.splashScreenBuilder?.call( + context, + () { + if (configuration.showIntroduction == false) { + return Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => _home(configuration, context), + ), + ); + } + return Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => _introduction(configuration, context), + ), + ); + }, + ) ?? + const Scaffold( + body: SizedBox.shrink(), + ); +} + +Widget _introduction( + StartUserStoryConfiguration configuration, + BuildContext context, +) { + var introduction = Introduction( + service: configuration.introductionService, + navigateTo: () { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => _home(configuration, context), + ), + ); + }, + options: configuration.introductionOptions, + physics: configuration.introductionScrollPhysics, + child: configuration.introductionFallbackScreen, + ); + return Scaffold( + body: introduction, + ); +} + +Widget _home( + StartUserStoryConfiguration configuration, + BuildContext context, +) { + var home = configuration.homeEntry; + return Scaffold( + body: home, + ); +} diff --git a/pubspec.lock b/pubspec.lock index fa3b8e4..1f5b628 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,30 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" async: dependency: transitive description: @@ -17,6 +41,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: c9aabae0718ec394e5bc3c7272e6bb0dc0b32201a08fe185ec1d8401d3e39309 + url: "https://pub.dev" + source: hosted + version: "8.8.1" characters: dependency: transitive description: @@ -33,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" collection: dependency: transitive description: @@ -41,6 +97,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -49,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + url: "https://pub.dev" + source: hosted + version: "2.3.4" fake_async: dependency: transitive description: @@ -57,11 +137,72 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_data_interface: + dependency: transitive + description: + path: "." + ref: "1.0.0" + resolved-ref: "500ed1d08095b33387ae3aa4ed1a2ad4d2fb2ac3" + url: "https://github.com/Iconica-Development/flutter_data_interface.git" + source: git + version: "1.0.0" + flutter_introduction: + dependency: "direct main" + description: + path: "packages/flutter_introduction" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_interface: + dependency: transitive + description: + path: "packages/flutter_introduction_interface" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_service: + dependency: transitive + description: + path: "packages/flutter_introduction_service" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" + flutter_introduction_widget: + dependency: transitive + description: + path: "packages/flutter_introduction_widget" + ref: "2.0.0" + resolved-ref: d4037160ce6c7d51d5d1b35b3803bc46a257c7b5 + url: "https://github.com/Iconica-Development/flutter_introduction" + source: git + version: "2.0.0" flutter_lints: dependency: "direct dev" description: @@ -75,6 +216,27 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "3b40e751eaaa855179b416974d59d29669e750d2e50fcdb2b37f1cb0ca8c803a" + url: "https://pub.dev" + source: hosted + version: "13.0.1" lints: dependency: transitive description: @@ -83,6 +245,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: @@ -107,6 +277,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + url: "https://pub.dev" + source: hosted + version: "5.4.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" path: dependency: transitive description: @@ -115,11 +301,27 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.3" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" source_span: dependency: transitive description: @@ -168,6 +370,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" vector_math: dependency: transitive description: @@ -176,6 +386,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" web: dependency: transitive description: @@ -184,5 +402,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" sdks: dart: ">=3.2.5 <4.0.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index af8154d..caaf197 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,90 +1,26 @@ name: flutter_start -description: "A new Flutter project." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 +description: "Flutter_start is a package that allows you to jumpstart your application with a splashScreen, introduction and a home." +publish_to: "none" +version: 1.0.0 environment: - sdk: '>=3.2.5 <4.0.0' + sdk: ">=3.2.5 <4.0.0" -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter - - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + flutter_introduction: + git: + url: https://github.com/Iconica-Development/flutter_introduction + ref: 2.0.0 + path: packages/flutter_introduction + go_router: ^13.0.1 dev_dependencies: flutter_test: sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^2.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index 86db51f..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:flutter_start/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}