Murali Vegesna
Murali Vegesna

Reputation: 23

Flutter navigator.push() object issue

While passing an object from one class to another class by using Navigator.push(), the object does not get modifying even its declared as not final.

Main Screen : Created an object(userBean) and passing to First screen First Screen : displaying the same object(userBean) values, and passing again the same object(userBean) to second screen. Second screen : trying to get modify the same object (userBean) in second screen, and printing the same object(userBean) in first screen by using refreshData.then method.

Main.dart
import 'package:flutter/material.dart';
import 'package:flutter_app_poc1/firstSceeen.dart';
import 'package:flutter_app_poc1/secondScreen.dart';
import 'package:flutter_app_poc1/userbean.dart';
void main() => runApp(MyApp());

typedef void refreshCallBack(int index);
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override

  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {

  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override

  _MyHomePageState createState() => _MyHomePageState();

}

class _MyHomePageState extends State<MyHomePage> {

  UserBean user = new UserBean();

  final List<String> hhList = ["General", "edu"];
  int _counter = 0;

  @override

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            new FlatButton(

                child: Text("Next Screen"),

                onPressed: () {

                  user.id = 1;

                  user.name = "Ramesh";

                  Future<dynamic> refreshData =

                      Navigator.of(context).push(new MaterialPageRoute<dynamic>(

                    builder: (BuildContext context) {

                      return new FirstScreen(userbean: user);

                    },

                  ));

                  refreshData.then((_) {

                  });

                }),
          ],

        ),

      ),

     );
  }
}


Firstscreen.dart
import 'package:flutter/material.dart';
import 'package:flutter_app_poc1/secondScreen.dart';
import 'package:flutter_app_poc1/userbean.dart';
typedef void refreshCallBack(int index);
class FirstScreen extends StatefulWidget {
  UserBean userbean;
  FirstScreen({Key key, this.userbean}) : super(key: key);

  @override
  _FirstScreenState createState() => _FirstScreenState();

}

class _FirstScreenState extends State<FirstScreen> {

  String userName;

  final List<String> hhList = ["General", "edu"];

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        title: Text("first"),

      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            new Text(widget.userbean.name),

            new RaisedButton(onPressed: (){

              Future<dynamic> refreshData =

              Navigator.of(context).push(new MaterialPageRoute<dynamic>(

                builder: (BuildContext context) {

                  return new SecondScreen(userbean: widget.userbean);

                },

              ));

              refreshData.then((_) {
                print(widget.userbean.name);
              });
            }),
          ],

        ),

      ),
     );
  }
 }



secondscreen.dart
import 'package:flutter/material.dart';

import 'package:flutter_app_poc1/userbean.dart';

class SecondScreen extends StatefulWidget {

  UserBean userbean;
  SecondScreen({Key key, this.userbean}) : super(key: key);

  @override

  _SecondScreenState createState() => _SecondScreenState();

}

class _SecondScreenState extends State<SecondScreen> {

  UserBean bean = UserBean();

  @override

  Widget build(BuildContext context) {

    bean.name = "suresh";
    return Scaffold(

        appBar: AppBar(

          title: Text("Previous Screen"),

        ),

        body: Center(

          child: new FlatButton(

              child: Text(bean.name),

              onPressed: () {

                print(bean.name);

                widget.userbean = bean;

                Navigator.pop(context, true);

              }),

        ));

  }

}

Upvotes: 2

Views: 3644

Answers (1)

Raj008
Raj008

Reputation: 3917

@Murali

If you want to follow the same procedure pass object, then follow the below procedure.

From Navigator.pop push again new Object

onPressed: () {
            print("TEST second screen :"+bean.name);

            /// here modifying with new object.
            widget.userbean = bean;

            Navigator.pop(context, widget.userbean);
          }),

In second screen Get new Object from Feature Method as below

 Future<UserBean> refreshData =
          Navigator.of(context).push(new MaterialPageRoute<UserBean>(
            builder: (BuildContext context) {
              return new SecondScreen(userbean: widget.userbean);
            },
          ));
          refreshData.then((res) {
            print("TEST First screen : ${res.name}");
          });

Then Object will change with new values.

Upvotes: 2

Related Questions