Skip to content

Create a builder that builds a widget that a wraps routes of Navigator. - #33706

Closed
ivk1800 wants to merge 1 commit into
flutter:masterfrom
ivk1800:navigator-router-wrapper-builder
Closed

ivk1800 wants to merge 1 commit into
flutter:masterfrom
ivk1800:navigator-router-wrapper-builder

Conversation

@ivk1800

@ivk1800 ivk1800 commented Jun 1, 2019

Copy link
Copy Markdown
Contributor

Description

I add builder wrapper of navigator routers for access Navigator from above routers of widgets tree.
It is allow me access to Navigator from root widget and control navigation of application. for example I can create abstract Router for Viewmodel or Presenter and control app routing from logic layer without clearly communication with "View" layer.

you say why not wrap MaterialApp in to RootWidget? but in but in this case I will not have access to MediaQuuery, Navigator etc.

you say why you push to navigator RootRoute as first route and control Navigation from him? because netx routes will be have back arrow on AppBar. And I can accidentally pop her from Navigaton. It is no way.

you say why not create custom App with WidgetApp and Navigator? no way, because I want use all features of MaterialApp or CupertionApp which encapsulated in exist Widget.

below is an example;

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(),
      ),
      navigatorRoutesWrapperBuilder: (BuildContext context, Widget child) {
        return RootWidget(
          child: child,
        );
      },
    );
  }
}

class RootWidget extends StatefulWidget {
  final Widget child;

  RootWidget({Key key, this.child}) : super(key: key);

  @override
  _RootWidgetState createState() => _RootWidgetState();
}

class _RootWidgetState extends State<RootWidget> {

  RootAppBloc _bloc;

  @override
  void initState() {
    _bloc = RootAppBloc();
    super.initState();

    _bloc.pushLoginScreen.listen((_) {
      Route<dynamic> route = MaterialPageRoute<dynamic>(builder: (BuildContext context) {
        return Text('login');
      });

      Navigator.of(context).pushAndRemoveUntil(route, (Route<dynamic> route) {
        return false;
      });
    });

    _bloc.pushMainScreen.listen((_) {
      // some code
    });
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }
}

class RootAppBloc {
  Stream<void> pushMainScreen;
  Stream<void> pushLoginScreen;
}

Related Issues

Tests

I added the following tests:

Test builder of CupertinoApp
Test builder of MaterialApp
Test builder of WidgetsApp
Test builder of Navigator
Test builder of Overlay

Checklist

Before you create this PR confirm that it meets all requirements listed below by checking the relevant checkboxes ([x]). This will ensure a smooth and quick review process.

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I signed the CLA.
  • I read and followed the Flutter Style Guide, including Features we expect every widget to implement.
  • I updated/added relevant documentation (doc comments with ///).
  • All existing and new tests are passing.
  • The analyzer (flutter analyze --flutter-repo) does not report any problems on my PR.
  • I am willing to follow-up on review comments in a timely manner.

Breaking Change

Does your PR require Flutter developers to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (Please read Handling breaking changes). Replace this with a link to the e-mail where you asked for input on this proposed change.
  • No, this is not a breaking change.

@ghost

ghost commented Jun 1, 2019 •

Copy link
Copy Markdown

@pepegich Hi do you know if it is possible in Flutter Web to open a URL directly to a Tab? like https://groups.google.com/forum/#!topic/flutter-dev/UzLU1PczCYo

Something like myapp/#/tab2 or something

@Piinks Piinks added f: routes Navigator, Router, and related APIs. framework flutter/packages/flutter repository. See also f: labels. labels Jun 3, 2019
@goderbauer

Copy link
Copy Markdown
Member

Can you use https://master-api.flutter.dev/flutter/widgets/WidgetsApp/onGenerateRoute.html for your use case? Similar options exist on MaterialApp and CupertinoApp.

If that doesn't work, it would probably be a good idea to open an issue first and discuss the use case there.

@goderbauer goderbauer closed this Jun 5, 2019
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Aug 6, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

f: routes Navigator, Router, and related APIs. framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants