ModalRoute.of(context)!.settings.arguments as int; Everytime Return Null Value [ SOLVED ]

Viewed 1171

I'm developing a Flutter Mobile App and I use this:

int elemanSayisi = ModalRoute.of(context)!.settings.arguments as int;

but why does this return null value every-time?

Main Class is:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_navigations/green_page.dart';
import 'package:flutter_navigations/orange_page.dart';
import 'package:flutter_navigations/red_page.dart';
import 'package:flutter_navigations/route_generator.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    int elemanSayisi = ModalRoute.of(context)!.settings.arguments as int;
    print('Eleman Sayısı Alındı : $elemanSayisi');
    return MaterialApp(
      title: 'Material App',
      home: AnaSayfa(),
      onGenerateRoute: RouteGenerator.routeGenerator,
    );
  }
}

class AnaSayfa extends StatelessWidget {
  const AnaSayfa({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Navigation Page"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            //YELLOW PAGE PUSH NAMED
            ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, '/yellowPage');
              },
              child: Text('Yellow Page'),
              style: ElevatedButton.styleFrom(primary: Colors.yellow),
            ),
            //CREATE LIST BUTTON
            ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(
                  context,
                  '/ogrenciListesi',
                  arguments: 60,
                );
              },
              child: Text('Create List'),
              style: ElevatedButton.styleFrom(primary: Colors.green),
            )
          ],
        ),
      ),
    );
  }
}

Route Generator Class is:

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_navigations/main.dart';
import 'package:flutter_navigations/ogrenci_listesi.dart';
import 'package:flutter_navigations/orange_page.dart';
import 'package:flutter_navigations/yellow_page.dart';

class RouteGenerator {
  static Route<dynamic>? _routeOlustur(
      Widget gidilecekWidget, RouteSettings settings) {
    if (defaultTargetPlatform == TargetPlatform.iOS) {
      return CupertinoPageRoute(
        builder: (context) => gidilecekWidget,
        settings: settings,
      );
    } else if (defaultTargetPlatform == TargetPlatform.android) {
      return MaterialPageRoute(
        builder: (context) => gidilecekWidget,
        settings: settings,
      );
    } else {
      return CupertinoPageRoute(
        builder: (context) => gidilecekWidget,
        settings: settings,
      );
    }
  }

  static Route<dynamic>? routeGenerator(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return _routeOlustur(AnaSayfa(), settings);

      case '/orangePage':
        return _routeOlustur(OrangePage(), settings);

      case '/yellowPage':
        return _routeOlustur(YellowPage(), settings);

      case '/ogrenciListesi':
        print(settings.arguments);
        return _routeOlustur(OgrenciListesi(), settings);

      default:
        return MaterialPageRoute(
          builder: (context) => Scaffold(
            appBar: AppBar(title: Text("Error")),
            body: Center(child: Text('Not Found')),
          ),
        );
    }
  }
}
1 Answers

You must get arguments value from the build method of the target page. This is a simplified example

static Route<dynamic>? routeGenerator(RouteSettings settings) {
  switch (settings.name) {
    case '/orangePage':
      return MaterialPageRoute(
        builder: (context) => OrangePage(),
        settings: settings,
      );
  }
}
Navigator.pushNamed(context, '/orangePage', arguments: 50);
class OrangePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    int value = ModalRoute.of(context)!.settings.arguments as int;
    return Scaffold(body: Center(child: Text(value)));
  }
}

More info : https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments

About BuildContext object : https://www.youtube.com/watch?v=rIaaH87z1-g

Related