multi_page_feature 1.0.0 copy "multi_page_feature: ^1.0.0" to clipboard
multi_page_feature: ^1.0.0 copied to clipboard

Handle multi page features navigation from a bloc emitting trigger states.

example/lib/main.dart

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:multi_page_feature/multi_page_feature.dart';

const FIRST_STEP_ROUTE_NAME = 'firstStep';
final navigationObserver = MultiPageFeatureNavigationObserver();
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Multi Page Feature Demo',
      home: Home(),
      navigatorObservers: [navigationObserver],
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Demo'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Go!'),
          onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                settings: RouteSettings(name: FIRST_STEP_ROUTE_NAME),
                builder: (context) => MultiPageFeature(
                  blocCreate: (_) => MultiPageDemoBloc(),
                  navigationObserver: navigationObserver,
                  pages: [
                    FirstStepPage(),
                    SecondStepPage(),
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

class MultiPageDemoBloc extends MultiPageFeatureBloc {
  MultiPageDemoBloc() : super(First());

  @override
  Stream<MultiPageFeatureState> mapEventToState(
    MultiPageFeatureEvent event,
  ) async* {
    final state = handleEvent(event);
    if (state != null) {
      yield state;
    } else {
      switch (event.runtimeType) {
        case GenerateRandomText:
          final text = Random().nextInt(100).toString();
          yield RandomText(text);
          break;
        case GoToSecondStep:
          yield Second();
          break;
        case SecondStepCompleted:
          add(MultiPageFeatureFinished());
          break;
      }
    }
  }
}

class First extends PageChangingState {}

class Second extends PageChangingState {}

class RandomText extends MultiPageFeatureState {
  final String text;

  RandomText(this.text);
  @override
  List<Object> get props => [text];
}

class GenerateRandomText extends MultiPageFeatureEvent {}

class GoToSecondStep extends MultiPageFeatureEvent {}

class SecondStepCompleted extends MultiPageFeatureEvent {}

class FirstStepPage extends FeaturePage {
  @override
  bool get isInitialPage => true;

  @override
  String get name => FIRST_STEP_ROUTE_NAME;

  @override
  Widget pageBuilder(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First step'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            BlocBuilder<MultiPageFeatureBloc, MultiPageFeatureState>(
              buildWhen: (previous, current) => !(current is PageChangingState),
              builder: (context, state) {
                if (state.runtimeType == RandomText) {
                  return Text(
                    (state as RandomText).text ?? '-',
                  );
                } else {
                  return Text(state.toString());
                }
              },
            ),
            RaisedButton(
              child: Text('Update text'),
              onPressed: () {
                BlocProvider.of<MultiPageFeatureBloc>(context).add(
                  GenerateRandomText(),
                );
              },
            ),
            RaisedButton(
              child: Text('Next'),
              onPressed: () {
                BlocProvider.of<MultiPageFeatureBloc>(context).add(
                  GoToSecondStep(),
                );
              },
            ),
          ],
        ),
      ),
    );
  }

  @override
  Type get triggerState => First;
}

class SecondStepPage extends FeaturePage {
  @override
  bool get isInitialPage => false;

  @override
  String get name => 'secondStep';

  @override
  Widget pageBuilder(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second step'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Complete'),
          onPressed: () {
            BlocProvider.of<MultiPageFeatureBloc>(context).add(
              SecondStepCompleted(),
            );
          },
        ),
      ),
    );
  }

  @override
  Type get triggerState => Second;
}
0
likes
40
points
9
downloads

Publisher

unverified uploader

Weekly Downloads

Handle multi page features navigation from a bloc emitting trigger states.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

equatable, flutter, flutter_bloc, meta, pedantic

More

Packages that depend on multi_page_feature