SchabanBo / qlevar_router

Manage you project Routes. Create nested routes. Simply navigation without context to your pages. Change only one sub widget in your page when navigating to new route.
MIT License
86 stars 22 forks source link

Qlevar_router & DevicePreview #145

Closed jessicamrbr closed 2 months ago

jessicamrbr commented 9 months ago

I'm experiencing some error messages when trying to use both packages together.

When refreshing the page in the web browser I receive:

The following assertion was thrown building QRouter(state: _QRouterState...):
Assertion failed: .../flutter/lib/src/widgets/navigator.dart:3563:14
observer.navigator == null
is not true

I am trying:

DevicePreview(
   builder: (devicePreviewCtx) => MaterialApp.router(
     useInheritedMediaQuery: true,
     routerDelegate: QRouterDelegate(AppRoutes.routes),
     routeInformationParser: const QRouteInformationParser(),
     builder: (BuildContext rootCtx, Widget? widget) => Env.enableDevicePreview
       ? DevicePreview.appBuilder(rootCtx, widget)
       : widget ?? const Material(),
   );
}

any tips?

SchabanBo commented 2 months ago

You could use it like this

import 'package:device_preview/device_preview.dart';
import 'package:flutter/material.dart';
import 'package:qlevar_router/qlevar_router.dart';

void main() async {
  runApp(DevicePreview(builder: (_) => const MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    final List<QRoute> router = [
      QRoute(
        path: '/',
        builder: () {
          return const HomePage();
        },
      ),
      QRoute(
        path: '/schedule',
        name: 'schedule',
        builder: () => const PageOne(),
      ),
      QRoute(
        path: '/scheduleDetailed',
        name: 'scheduleDetailed',
        builder: () => const PageTow(),
      ),
    ];
    return MaterialApp.router(
      routeInformationParser: const QRouteInformationParser(),
      routerDelegate: QRouterDelegate(router, withWebBar: true),
      locale: DevicePreview.locale(context),
      builder: (context, child) {
        return DevicePreview.appBuilder(context, child);
      },
    );
  }
}

const navigatorName = 'bottom sheet';

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.green,
      body: Center(
        child: ElevatedButton(
          child: const Text("Go"),
          onPressed: () async {
            QR.to('/schedule');
          },
        ),
      ),
    );
  }
}

class PageOne extends StatefulWidget {
  const PageOne({super.key});

  @override
  State<PageOne> createState() => _PageOneState();
}

class _PageOneState extends State<PageOne> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Page One"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextButton(
              child: const Text("Go to page 2"),
              onPressed: () {
                QR.to('/scheduleDetailed');
              },
            ),
            TextButton(
              child: const Text("Back"),
              onPressed: () {
                QR.back();
              },
            ),
          ],
        ),
      ),
    );
  }
}

class PageTow extends StatelessWidget {
  const PageTow({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Page One"),
      ),
      body: const Center(
        child: Icon(Icons.home),
      ),
    );
  }
}