mirror of
https://github.com/Iconica-Development/flutter_start.git
synced 2025-05-19 10:33:45 +02:00
Compare commits
No commits in common. "master" and "3.0.0" have entirely different histories.
14 changed files with 157 additions and 221 deletions
14
.github/workflows/release.yml
vendored
14
.github/workflows/release.yml
vendored
|
@ -1,14 +0,0 @@
|
||||||
name: Iconica Standard Component Release Workflow
|
|
||||||
# Workflow Caller version: 1.0.0
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
call-global-iconica-workflow:
|
|
||||||
uses: Iconica-Development/.github/.github/workflows/component-release.yml@master
|
|
||||||
secrets: inherit
|
|
||||||
permissions: write-all
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -44,7 +44,3 @@ app.*.map.json
|
||||||
ios
|
ios
|
||||||
.metadata
|
.metadata
|
||||||
pubspec.lock
|
pubspec.lock
|
||||||
|
|
||||||
# FVM Version Cache
|
|
||||||
.fvm/
|
|
||||||
.fvmrc
|
|
||||||
|
|
22
CHANGELOG.md
22
CHANGELOG.md
|
@ -1,25 +1,3 @@
|
||||||
## 4.2.4
|
|
||||||
- Fixed the userstory to always call the splashScreenFuture and killswitchservice logic when a custom splashScreenBuilder is provided
|
|
||||||
|
|
||||||
## 4.2.3
|
|
||||||
- Added check if introduction should be shown according to the service before showing the introduction at all
|
|
||||||
|
|
||||||
## 4.2.2
|
|
||||||
- Added custom navigator in the root of the navigator user-story
|
|
||||||
|
|
||||||
## 4.2.1
|
|
||||||
- Updated flutter_introduction to 5.0.0
|
|
||||||
|
|
||||||
## 4.1.0
|
|
||||||
- Updated README
|
|
||||||
- Removed check if the introductions should be shown.
|
|
||||||
- Updated flutter_introduction to 3.1.0
|
|
||||||
|
|
||||||
## 4.0.0
|
|
||||||
- Added default introduction page.
|
|
||||||
- Added default splash screen.
|
|
||||||
- Changed the way the splash screen is enabled/disabled.
|
|
||||||
|
|
||||||
## 3.0.0
|
## 3.0.0
|
||||||
|
|
||||||
BREAKING:
|
BREAKING:
|
||||||
|
|
102
README.md
102
README.md
|
@ -6,65 +6,60 @@ Flutter_start is a package that allows you to jumpstart your application with a
|
||||||
|
|
||||||
To use this package, add flutter_start as a dependency in your pubspec.yaml file:
|
To use this package, add flutter_start as a dependency in your pubspec.yaml file:
|
||||||
|
|
||||||
```yaml
|
```
|
||||||
flutter_start:
|
flutter_start:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Iconica-Development/flutter_start
|
url: https://github.com/Iconica-Development/flutter_start
|
||||||
ref: 4.1.0
|
ref: <Version>
|
||||||
```
|
```
|
||||||
|
|
||||||
## go_router
|
To use the module within your Flutter-application with predefined `Go_router` routes you should add the following:
|
||||||
|
|
||||||
Add `go_router` as dependency to your project.
|
|
||||||
|
|
||||||
|
Add go_router as dependency to your project.
|
||||||
Add the following configuration to your flutter_application:
|
Add the following configuration to your flutter_application:
|
||||||
|
|
||||||
```
|
```
|
||||||
List<GoRoute> getStartStoryRoutes() => getStartStoryRoutes();
|
StartUserStoryConfiguration startUserStoryConfiguration = const StartUserStoryConfiguration();
|
||||||
```
|
```
|
||||||
|
|
||||||
Or with options:
|
and set the values as you wish.
|
||||||
|
|
||||||
Place the following code somewhere in your project where it can be accessed globally:
|
Next add the `StartUserStoryConfiguration` to `getStartStoryRoutes` Like so:
|
||||||
|
|
||||||
```
|
```
|
||||||
var startUserStoryConfiguration = const StartUserStoryConfiguration();
|
List<GoRoute> getStartRoutes() => getStartStoryRoutes(
|
||||||
```
|
startUserStoryConfiguration,
|
||||||
|
|
||||||
```
|
|
||||||
List<GoRoute> getStartStoryRoutes() => getStartStoryRoutes(
|
|
||||||
configuration: startUserStoryConfiguration,
|
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
Finally add the `getStartRoutes` to your `go_router` routes like so:
|
Finally add the `getStartRoutes` to your `Go_router` routes like so:
|
||||||
|
|
||||||
```
|
```
|
||||||
final GoRouter _router = GoRouter(
|
final GoRouter _router = GoRouter(
|
||||||
routes: <RouteBase>[
|
routes: <RouteBase>[
|
||||||
...getStartStoryRoutes()
|
...getStartRoutes()
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
The routes that can be used to navigate are:
|
The routes that can be used to navigate are:
|
||||||
|
|
||||||
For routing to the `splashScreen`:
|
For routing to the `SplashScreen`:
|
||||||
|
|
||||||
```
|
```
|
||||||
static const String splashScreen = '/splashScreen';
|
static const String splashScreen = '/splashScreen';
|
||||||
```
|
```
|
||||||
|
|
||||||
For routing to the `introduction`:
|
For routing to the `Introduction`:
|
||||||
|
|
||||||
```
|
```
|
||||||
static const String introduction = '/introduction';
|
static const String introduction = '/introduction';
|
||||||
```
|
```
|
||||||
|
|
||||||
For routing to the `home`:
|
For routing to the `HomeEntry`:
|
||||||
|
|
||||||
```
|
```
|
||||||
static const String home = '/home';
|
static const String home = '/home';
|
||||||
```
|
```
|
||||||
|
|
||||||
If you don't want a SplashScreen in your application set your initialRoute to `Introduction`:
|
If you don't want a SplashScreen in your application set your initialRoute to `Introduction`:
|
||||||
|
@ -78,64 +73,33 @@ final GoRouter _router = GoRouter(
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
## Navigator
|
To use the module within your Flutter-application without predefined `Go_router` routes but with `Navigator` routes add the following :
|
||||||
|
|
||||||
Add the following code to the build-method of a chosen widget like so:
|
Add the following configuration to your flutter_application:
|
||||||
```
|
|
||||||
class Example extends StatelessWidget {
|
|
||||||
const Example({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return NavigatorStartUserStory(
|
|
||||||
onComplete: (context) {},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
or with options:
|
|
||||||
|
|
||||||
Place the following code somewhere in your project where it can be accessed globally:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
var startUserStoryConfiguration = const StartUserStoryConfiguration();
|
StartUserStoryConfiguration startUserStoryConfiguration = const StartUserStoryConfiguration();
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
Add the following code to the build-method of a chosen widget:
|
||||||
class Example extends StatelessWidget {
|
|
||||||
const Example({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return NavigatorStartUserStory(
|
|
||||||
configuration: startUserStoryConfiguration,
|
|
||||||
onComplete: (context) {},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
startNavigatorUserStory(startUserStoryConfiguration, context);
|
||||||
|
```
|
||||||
|
|
||||||
|
If the splashScreenBuilder is not used the SplashScreen will be skipped.
|
||||||
|
|
||||||
The `StartUserStoryConfiguration` has its own parameters, as specified below:
|
The `StartUserStoryConfiguration` has its own parameters, as specified below:
|
||||||
| Parameter | Explanation |
|
| Parameter | Explanation |
|
||||||
|-----------|-------------|
|
|-----------|-------------|
|
||||||
| `splashScreenBuilder` | The builder to override the default splashScreen |
|
| splashScreenBuilder | The builder for the splashScreen. |
|
||||||
| `introductionBuilder` | A builder to wrap the introductions in your own page |
|
| introductionOptions | The options for the introduction. |
|
||||||
| `introductionOptionsBuilder` | The builder to override the default `introductionOptions` |
|
| introductionService | The service for the introduction. Default IntroductionService (SharedPreferencesIntroductionDataProvider()) |
|
||||||
|`introductionService` | The service to override the default `introductionService` |
|
| homeEntry | The widget that will be shown after the introduction. |
|
||||||
| `homeScreenRoute` | The route to navigate to after the introduction or splashScreen is completed |
|
| introductionFallbackScreen | The widget that will be shown when the introduction is skipped. |
|
||||||
| `introductionFallbackScreen` | The screen that is shown when something goes wrong fetching data for the introduction |
|
| introductionScrollPhysics | The scrollPhysics for the introduction. |
|
||||||
| `introductionScrollPhysics` | The scroll physics for the introduction |
|
| showIntroduction | Whether or not the introduction should be shown. |
|
||||||
| `showIntroduction` | A boolean to show the introduction or not. Defaults to true |
|
| useKillswitch | Whether or not the killswitch should be used. This will only work when you use the splashScreen and you need to have a active internet connection|
|
||||||
| `useKillswitch` | A boolean to use the killswitch or not. Defaults to false |
|
|
||||||
| `minimumSplashScreenDuration` | The minimum duration the splashScreen should be shown. Defaults to 3 seconds |
|
|
||||||
| `splashScreenFuture` | The future to be completed before the splashScreen is completed |
|
|
||||||
| `splashScreenCenterWidget` | The widget to be shown in the center of the splashScreen |
|
|
||||||
| `splashScreenBackgroundColor` | The color of the splashScreen background. Defaults to Color(0xff212121) |
|
|
||||||
| `canPopFromIntroduction` | Allow popping from introduction, defaults to true. Defaults to true |
|
|
||||||
| `killswitchService` | The service to override the default killswitch service |
|
|
||||||
| `showSplashScreen` | A boolean to show the splashScreen or not. Defaults to true |
|
|
||||||
|
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
|
|
||||||
|
|
3
example/.gitignore
vendored
3
example/.gitignore
vendored
|
@ -31,9 +31,6 @@ migrate_working_dir/
|
||||||
.pub/
|
.pub/
|
||||||
/build/
|
/build/
|
||||||
|
|
||||||
# platforms
|
|
||||||
/web
|
|
||||||
|
|
||||||
# Symbolication related
|
# Symbolication related
|
||||||
app.*.symbols
|
app.*.symbols
|
||||||
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
# example
|
|
||||||
|
|
||||||
A new Flutter project.
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
This project is a starting point for a Flutter application.
|
|
||||||
|
|
||||||
A few resources to get you started if this is your first Flutter project:
|
|
||||||
|
|
||||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
|
||||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
|
||||||
|
|
||||||
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.
|
|
|
@ -31,7 +31,7 @@ class Home extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<GoRoute> getStartRoutes() => getStartStoryRoutes(
|
List<GoRoute> getStartRoutes() => getStartStoryRoutes(
|
||||||
configuration: config,
|
config,
|
||||||
);
|
);
|
||||||
|
|
||||||
StartUserStoryConfiguration config = StartUserStoryConfiguration(
|
StartUserStoryConfiguration config = StartUserStoryConfiguration(
|
||||||
|
@ -39,6 +39,38 @@ StartUserStoryConfiguration config = StartUserStoryConfiguration(
|
||||||
splashScreenBuilder: (context, onFinish) => SplashScreen(
|
splashScreenBuilder: (context, onFinish) => SplashScreen(
|
||||||
onFinish: onFinish,
|
onFinish: onFinish,
|
||||||
),
|
),
|
||||||
|
introductionOptionsBuilder: (ctx) => 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),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
class SplashScreen extends StatefulWidget {
|
class SplashScreen extends StatefulWidget {
|
||||||
|
@ -82,3 +114,17 @@ class HomeEntry extends StatelessWidget {
|
||||||
body: const Center(child: Text('HomeEntry')),
|
body: const Center(child: Text('HomeEntry')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ExampleIntroductionDataProvider
|
||||||
|
implements SharedPreferencesIntroductionDataProvider {
|
||||||
|
@override
|
||||||
|
String key = 'example';
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> setCompleted({bool value = true}) async =>
|
||||||
|
// ignore: void_checks
|
||||||
|
false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> shouldShow() async => true;
|
||||||
|
}
|
||||||
|
|
|
@ -12,8 +12,10 @@ dependencies:
|
||||||
flutter_start:
|
flutter_start:
|
||||||
path: ../
|
path: ../
|
||||||
flutter_introduction_shared_preferences:
|
flutter_introduction_shared_preferences:
|
||||||
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub/
|
git:
|
||||||
version: ^5.0.0
|
url: https://github.com/Iconica-Development/flutter_introduction
|
||||||
|
ref: 2.1.0
|
||||||
|
path: packages/flutter_introduction_shared_preferences
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
@ -20,10 +20,9 @@ class StartUserStoryConfiguration {
|
||||||
this.minimumSplashScreenDuration = 3,
|
this.minimumSplashScreenDuration = 3,
|
||||||
this.splashScreenFuture,
|
this.splashScreenFuture,
|
||||||
this.splashScreenCenterWidget,
|
this.splashScreenCenterWidget,
|
||||||
this.splashScreenBackgroundColor = const Color(0xff212121),
|
this.splashScreenBackgroundColor,
|
||||||
this.canPopFromIntroduction = true,
|
this.canPopFromIntroduction = true,
|
||||||
this.killswitchService,
|
this.killswitchService,
|
||||||
this.showSplashScreen = true,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/// You can use this to build your own splash screen.
|
/// You can use this to build your own splash screen.
|
||||||
|
@ -69,6 +68,9 @@ class StartUserStoryConfiguration {
|
||||||
/// Allow popping from introduction, defaults to true
|
/// Allow popping from introduction, defaults to true
|
||||||
final bool canPopFromIntroduction;
|
final bool canPopFromIntroduction;
|
||||||
|
|
||||||
/// If the splash screen should be shown or not.
|
/// returns true if the userstory should start with the introduction screen
|
||||||
final bool showSplashScreen;
|
bool get startWithIntroScreen =>
|
||||||
|
splashScreenBuilder == null &&
|
||||||
|
splashScreenCenterWidget == null &&
|
||||||
|
splashScreenBackgroundColor == null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,19 +11,19 @@ import 'package:flutter_start/src/go_router.dart';
|
||||||
import 'package:flutter_start/src/models/start_configuration.dart';
|
import 'package:flutter_start/src/models/start_configuration.dart';
|
||||||
import 'package:flutter_start/src/routes.dart';
|
import 'package:flutter_start/src/routes.dart';
|
||||||
import 'package:flutter_start/src/services/killswitch_service.dart';
|
import 'package:flutter_start/src/services/killswitch_service.dart';
|
||||||
import 'package:flutter_start/src/widgets/default_splash_screen.dart';
|
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
|
||||||
List<GoRoute> getStartStoryRoutes({
|
List<GoRoute> getStartStoryRoutes(
|
||||||
StartUserStoryConfiguration? configuration =
|
StartUserStoryConfiguration configuration,
|
||||||
const StartUserStoryConfiguration(),
|
) =>
|
||||||
}) =>
|
|
||||||
<GoRoute>[
|
<GoRoute>[
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: StartUserStoryRoutes.splashScreen,
|
path: StartUserStoryRoutes.splashScreen,
|
||||||
pageBuilder: (context, state) {
|
pageBuilder: (context, state) {
|
||||||
var go = context.go;
|
var go = context.go;
|
||||||
var isAllowedToPassThrough = false;
|
var isAllowedToPassThrough = false;
|
||||||
|
var introductionSeen = false;
|
||||||
String? routeAfterSplash;
|
String? routeAfterSplash;
|
||||||
Future<void> splashLoadingMethod() async {
|
Future<void> splashLoadingMethod() async {
|
||||||
await Future.wait<void>(
|
await Future.wait<void>(
|
||||||
|
@ -31,7 +31,7 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
Future.delayed(
|
Future.delayed(
|
||||||
Duration.zero,
|
Duration.zero,
|
||||||
() async {
|
() async {
|
||||||
if (configuration!.useKillswitch) {
|
if (configuration.useKillswitch) {
|
||||||
var killswitchService = configuration.killswitchService ??
|
var killswitchService = configuration.killswitchService ??
|
||||||
DefaultKillswitchService();
|
DefaultKillswitchService();
|
||||||
|
|
||||||
|
@ -39,6 +39,11 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
await killswitchService.isKillswitchActive();
|
await killswitchService.isKillswitchActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var introService = configuration.introductionService ??
|
||||||
|
IntroductionService(
|
||||||
|
SharedPreferencesIntroductionDataProvider(),
|
||||||
|
);
|
||||||
|
introductionSeen = !await introService.shouldShow();
|
||||||
if (context.mounted)
|
if (context.mounted)
|
||||||
routeAfterSplash = await configuration.splashScreenFuture
|
routeAfterSplash = await configuration.splashScreenFuture
|
||||||
?.call(context) ??
|
?.call(context) ??
|
||||||
|
@ -47,7 +52,7 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
),
|
),
|
||||||
Future.delayed(
|
Future.delayed(
|
||||||
Duration(
|
Duration(
|
||||||
seconds: configuration!.minimumSplashScreenDuration,
|
seconds: configuration.minimumSplashScreenDuration,
|
||||||
),
|
),
|
||||||
() async {},
|
() async {},
|
||||||
),
|
),
|
||||||
|
@ -56,7 +61,7 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
|
|
||||||
if (configuration.useKillswitch && isAllowedToPassThrough) return;
|
if (configuration.useKillswitch && isAllowedToPassThrough) return;
|
||||||
|
|
||||||
if ((!configuration.showIntroduction) && context.mounted) {
|
if (!configuration.showIntroduction || introductionSeen) {
|
||||||
return go(
|
return go(
|
||||||
routeAfterSplash ?? StartUserStoryRoutes.home,
|
routeAfterSplash ?? StartUserStoryRoutes.home,
|
||||||
);
|
);
|
||||||
|
@ -64,7 +69,7 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
return go(StartUserStoryRoutes.introduction);
|
return go(StartUserStoryRoutes.introduction);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (configuration!.splashScreenBuilder == null) {
|
if (configuration.splashScreenBuilder == null) {
|
||||||
unawaited(splashLoadingMethod());
|
unawaited(splashLoadingMethod());
|
||||||
}
|
}
|
||||||
return buildScreenWithoutTransition(
|
return buildScreenWithoutTransition(
|
||||||
|
@ -79,7 +84,7 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
body: Center(
|
body: Center(
|
||||||
child:
|
child:
|
||||||
configuration.splashScreenCenterWidget?.call(context) ??
|
configuration.splashScreenCenterWidget?.call(context) ??
|
||||||
defaultSplashScreen(context),
|
const SizedBox.shrink(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -89,7 +94,7 @@ List<GoRoute> getStartStoryRoutes({
|
||||||
path: StartUserStoryRoutes.introduction,
|
path: StartUserStoryRoutes.introduction,
|
||||||
pageBuilder: (context, state) {
|
pageBuilder: (context, state) {
|
||||||
var introduction = Introduction(
|
var introduction = Introduction(
|
||||||
service: configuration!.introductionService ??
|
service: configuration.introductionService ??
|
||||||
IntroductionService(
|
IntroductionService(
|
||||||
SharedPreferencesIntroductionDataProvider(),
|
SharedPreferencesIntroductionDataProvider(),
|
||||||
),
|
),
|
||||||
|
|
|
@ -3,7 +3,6 @@ import 'dart:async';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_start/flutter_start.dart';
|
import 'package:flutter_start/flutter_start.dart';
|
||||||
import 'package:flutter_start/src/services/killswitch_service.dart';
|
import 'package:flutter_start/src/services/killswitch_service.dart';
|
||||||
import 'package:flutter_start/src/widgets/default_splash_screen.dart';
|
|
||||||
|
|
||||||
/// Initial screen of the user story.
|
/// Initial screen of the user story.
|
||||||
///
|
///
|
||||||
|
@ -19,11 +18,13 @@ class NavigatorStartUserStory extends StatelessWidget {
|
||||||
final void Function(BuildContext context) onComplete;
|
final void Function(BuildContext context) onComplete;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Navigator(
|
Widget build(BuildContext context) {
|
||||||
onGenerateInitialRoutes: (_, __) => [
|
if (configuration.showIntroduction) {
|
||||||
_getInitialRoute(configuration, onComplete),
|
return _introduction(configuration, context, onComplete);
|
||||||
],
|
}
|
||||||
);
|
|
||||||
|
return _splashScreen(configuration, context, onComplete);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enter the start user story with the Navigator 1.0 API.
|
/// Enter the start user story with the Navigator 1.0 API.
|
||||||
|
@ -40,15 +41,6 @@ Future<void> startNavigatorUserStory(
|
||||||
StartUserStoryConfiguration configuration, {
|
StartUserStoryConfiguration configuration, {
|
||||||
required void Function(BuildContext context) onComplete,
|
required void Function(BuildContext context) onComplete,
|
||||||
}) async {
|
}) async {
|
||||||
var initialRoute = _getInitialRoute(configuration, onComplete);
|
|
||||||
|
|
||||||
await Navigator.of(context).push(initialRoute);
|
|
||||||
}
|
|
||||||
|
|
||||||
MaterialPageRoute<dynamic> _getInitialRoute(
|
|
||||||
StartUserStoryConfiguration configuration,
|
|
||||||
void Function(BuildContext context) onComplete,
|
|
||||||
) {
|
|
||||||
var initialRoute = MaterialPageRoute(
|
var initialRoute = MaterialPageRoute(
|
||||||
builder: (context) => _splashScreen(
|
builder: (context) => _splashScreen(
|
||||||
configuration,
|
configuration,
|
||||||
|
@ -57,7 +49,7 @@ MaterialPageRoute<dynamic> _getInitialRoute(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!configuration.showSplashScreen && configuration.showIntroduction) {
|
if (configuration.startWithIntroScreen) {
|
||||||
initialRoute = MaterialPageRoute(
|
initialRoute = MaterialPageRoute(
|
||||||
builder: (context) => _introduction(
|
builder: (context) => _introduction(
|
||||||
configuration,
|
configuration,
|
||||||
|
@ -66,7 +58,8 @@ MaterialPageRoute<dynamic> _getInitialRoute(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return initialRoute;
|
|
||||||
|
await Navigator.of(context).push(initialRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _splashScreen(
|
Widget _splashScreen(
|
||||||
|
@ -77,6 +70,7 @@ Widget _splashScreen(
|
||||||
var navigator = Navigator.of(context);
|
var navigator = Navigator.of(context);
|
||||||
|
|
||||||
var isAllowedToPassThrough = false;
|
var isAllowedToPassThrough = false;
|
||||||
|
var introductionSeen = false;
|
||||||
|
|
||||||
Future<void> splashHandler() async {
|
Future<void> splashHandler() async {
|
||||||
await Future.wait<void>(
|
await Future.wait<void>(
|
||||||
|
@ -92,6 +86,12 @@ Widget _splashScreen(
|
||||||
isAllowedToPassThrough =
|
isAllowedToPassThrough =
|
||||||
await killswitchService.isKillswitchActive();
|
await killswitchService.isKillswitchActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var introService = configuration.introductionService ??
|
||||||
|
IntroductionService(
|
||||||
|
SharedPreferencesIntroductionDataProvider(),
|
||||||
|
);
|
||||||
|
introductionSeen = !await introService.shouldShow();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Future.delayed(
|
Future.delayed(
|
||||||
|
@ -104,16 +104,13 @@ Widget _splashScreen(
|
||||||
|
|
||||||
if (configuration.useKillswitch && isAllowedToPassThrough) return;
|
if (configuration.useKillswitch && isAllowedToPassThrough) return;
|
||||||
|
|
||||||
var introService = configuration.introductionService ??
|
if ((!configuration.showIntroduction || introductionSeen) &&
|
||||||
IntroductionService(SharedPreferencesIntroductionDataProvider());
|
context.mounted) {
|
||||||
|
onComplete(context);
|
||||||
var shouldShowIntroduction =
|
return;
|
||||||
configuration.showIntroduction && await introService.shouldShow();
|
}
|
||||||
|
|
||||||
if (!context.mounted) return;
|
|
||||||
|
|
||||||
if (!shouldShowIntroduction) return onComplete(context);
|
|
||||||
|
|
||||||
|
if (context.mounted) {
|
||||||
await navigator.pushReplacement(
|
await navigator.pushReplacement(
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (context) => _introduction(
|
builder: (context) => _introduction(
|
||||||
|
@ -124,17 +121,17 @@ Widget _splashScreen(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
unawaited(splashHandler());
|
|
||||||
|
|
||||||
var builder = configuration.splashScreenBuilder;
|
var builder = configuration.splashScreenBuilder;
|
||||||
|
|
||||||
if (builder == null) {
|
if (builder == null) {
|
||||||
|
unawaited(splashHandler());
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: configuration.splashScreenBackgroundColor,
|
backgroundColor: configuration.splashScreenBackgroundColor,
|
||||||
body: Center(
|
body: Center(
|
||||||
child: configuration.splashScreenCenterWidget?.call(context) ??
|
child: configuration.splashScreenCenterWidget?.call(context) ??
|
||||||
defaultSplashScreen(context),
|
const SizedBox.shrink(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -161,11 +158,7 @@ Widget _introduction(
|
||||||
);
|
);
|
||||||
return PopScope(
|
return PopScope(
|
||||||
canPop: configuration.canPopFromIntroduction,
|
canPop: configuration.canPopFromIntroduction,
|
||||||
child: configuration.introductionBuilder?.call(
|
child: Scaffold(
|
||||||
context,
|
|
||||||
introduction,
|
|
||||||
) ??
|
|
||||||
Scaffold(
|
|
||||||
body: introduction,
|
body: introduction,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
Text defaultSplashScreen(BuildContext context) => Text(
|
|
||||||
'iconinstagram',
|
|
||||||
style: Theme.of(context).textTheme.headlineLarge,
|
|
||||||
);
|
|
25
pubspec.yaml
25
pubspec.yaml
|
@ -1,8 +1,7 @@
|
||||||
name: flutter_start
|
name: flutter_start
|
||||||
description: "Flutter_start is a package that allows you to jumpstart your application with a splashScreen, introduction and a home."
|
description: "Flutter_start is a package that allows you to jumpstart your application with a splashScreen, introduction and a home."
|
||||||
version: 4.2.4
|
publish_to: "none"
|
||||||
|
version: 3.0.0
|
||||||
publish_to: https://forgejo.internal.iconica.nl/api/packages/internal/pub
|
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.2.5 <4.0.0"
|
sdk: ">=3.2.5 <4.0.0"
|
||||||
|
@ -10,16 +9,20 @@ environment:
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
cupertino_icons: ">=1.0.2 <2.0.0"
|
cupertino_icons: ^1.0.2
|
||||||
go_router: ">=14.2.0 <15.0.0"
|
go_router: any
|
||||||
http: ">=1.2.1 <2.0.0"
|
http: any
|
||||||
package_info_plus: ">=8.0.0 <9.0.0"
|
package_info_plus: any
|
||||||
flutter_introduction:
|
flutter_introduction:
|
||||||
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub
|
git:
|
||||||
version: ^5.0.0
|
url: https://github.com/Iconica-Development/flutter_introduction
|
||||||
|
ref: 2.1.0
|
||||||
|
path: packages/flutter_introduction
|
||||||
flutter_introduction_shared_preferences:
|
flutter_introduction_shared_preferences:
|
||||||
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub/
|
git:
|
||||||
version: ^5.0.0
|
url: https://github.com/Iconica-Development/flutter_introduction
|
||||||
|
ref: 2.1.0
|
||||||
|
path: packages/flutter_introduction_shared_preferences
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
// This is an example unit test.
|
|
||||||
//
|
|
||||||
// A unit test tests a single function, method, or class. To learn more about
|
|
||||||
// writing unit tests, visit
|
|
||||||
// https://flutter.dev/docs/cookbook/testing/unit/introduction
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
group('Plus Operator', () {
|
|
||||||
test('should add two numbers together', () {
|
|
||||||
expect(1 + 1, 2);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
Loading…
Reference in a new issue