Shreyansh Sharma
Shreyansh Sharma

Reputation: 1844

The operator '[]' isn't defined for the type 'Map<String, Widget Function(BuildContext)> Function(dynamic)' in flutter

I tried to add these () brackets (at line 29), still it is showing me an error. (I saw it here)

And also for those ! marks, it is showing me these warnings - The '!' will have no effect because the receiver can't be null. And if I remove any of them, it is giving me an error. I also tried to add ? null check operator for routeBuilders, still it was showing me null-safety error.

Here is my code -

import 'package:flutter/material.dart';
import 'package:flutter_instagram_clone_final/Screens/nav/widgets/widgets.dart';
import 'package:flutter_instagram_clone_final/Screens/screens.dart';
import 'package:flutter_instagram_clone_final/config/custom_router.dart';
import 'package:flutter_instagram_clone_final/enums/bottom_nav_item.dart';

class TabNavigator extends StatelessWidget {
  static const String tabNavigatorRoot = '/';

  final GlobalKey<NavigatorState> navigatorKey;
  final BottomNavItem item;

  const TabNavigator({
    Key? key,
    required this.navigatorKey,
    required this.item,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final routeBuilders = _routeBuilders();
    return Navigator(
      key: navigatorKey,
      initialRoute: tabNavigatorRoot,
      onGenerateInitialRoutes: (_, initialRoute) {
        return [
          MaterialPageRoute(
            settings: RouteSettings(name: tabNavigatorRoot),
            builder: (context) => _routeBuilders!![initialRoute](context),
          )
        ];
      },
      onGenerateRoute: CustomRouter.onGenerateNestedRoute,
    );
  }

  Map<String, WidgetBuilder> _routeBuilders() {
    return {tabNavigatorRoot: (context) => _getScreen(context, item)};
  }

  Widget _getScreen(BuildContext context, BottomNavItem item) {
    switch (item) {
      case BottomNavItem.feed:
        return FeedScreen();

      case BottomNavItem.search:
        return SearchScreen();

      case BottomNavItem.create:
        return CreatePostScreen();

      case BottomNavItem.notifications:
        return NotificationScreen();

      case BottomNavItem.profile:
        return ProfileScreen();

      default:
        return Scaffold();
    }
  }
}

Upvotes: 0

Views: 517

Answers (2)

Shreyansh Sharma
Shreyansh Sharma

Reputation: 1844

Actually, I figured out the solution. It was just writing Map in declaration of routebuilders -

final Map routeBuilders = _routeBuilders();

Upvotes: 2

Zac
Zac

Reputation: 1103

In your code, _routeBuilders is a function

 Map<String, WidgetBuilder> _routeBuilders() {
    return {tabNavigatorRoot: (context) => _getScreen(context, item)};
  }

And that's what you're trying to use "[]" on here:

MaterialPageRoute(
            settings: RouteSettings(name: tabNavigatorRoot),
            builder: (context) => _routeBuilders!![initialRoute](context),
          )

I see that you've defined:

final routeBuilders = _routeBuilders();

So maybe this is what you meant to type:

MaterialPageRoute(
            settings: RouteSettings(name: tabNavigatorRoot),
            builder: (context) => routeBuilders[initialRoute](context),
          )

(Note that the underscore before routeBuilders has been removed).

Upvotes: 3

Related Questions