Saikumarreddy atluri
Saikumarreddy atluri

Reputation: 549

how to send data through different classes in different screens in flutter

i was struck here while making an application my code went like this

void main() {
runApp(Myapp());
}
class Myapp extends StatelessWidget {
bool s=false;

@override
Widget build(BuildContext context) {
return (MaterialApp(
    debugShowCheckedModeBanner: false,
    title: "haha app",
    theme: ThemeData(primarySwatch: Colors.lime),
    home: s ? HomeScreen(null) : LoginPage()));
}
}

the above code is of main.dart file

and this is my another file called Login.dart and the code goes like this

class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {

Widget build(BuildContext context) {
return(some button ontap:(\\ on tap on this i have to change the bool s value in main.dart to true how to do that){       
}
)
}

on tap the button the value s in main dart file should change to true but without navigator because we are not navigating here just a click. please help me, thanks in advance

Upvotes: 3

Views: 5083

Answers (1)

diegoveloper
diegoveloper

Reputation: 103551

You can use callbacks to communicate your widgets, like this

Create a method to get the callback , in this case : onChangeBool , pass the callback to your LoginPage Widget.

    class Myapp extends StatelessWidget {
    bool s=false;

    onChangeBool(){
      //change your var here 

      s = true;

      //refresh the state
         setState(() {

            });
    }

    @override
    Widget build(BuildContext context) {
    return (MaterialApp(
        debugShowCheckedModeBanner: false,
        title: "haha app",
        theme: ThemeData(primarySwatch: Colors.lime),
        home: s ? HomeScreen(null) : LoginPage(onPressed: () => onChangeBool() ));
    }
    }

Receive the callBack , and call it when you press the button

    class LoginPage extends StatefulWidget {

    final VoidCallback onPressed;

    LoginPage({this.onPressed});

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

    class _LoginPageState extends State<LoginPage> {

    Widget build(BuildContext context) {

        return RaisedButton(
          child: Text("button"),
          onPressed: (){
            widget.onPressed();
          },
        )

    }
    )
    }

In case you want to pass Data, you can use ValueChanged callback , or if you want to pass complex data, create your own callback using typedef/

A sample using ValueChanged.

    class Myapp extends StatelessWidget {
    bool s=false;

    receiveData(String data){
       print("your text here : $data");
    }

    @override
    Widget build(BuildContext context) {
    return (MaterialApp(
        debugShowCheckedModeBanner: false,
        title: "haha app",
        theme: ThemeData(primarySwatch: Colors.lime),
        home: s ? HomeScreen(null) : LoginPage(onPressed: receiveData ));
    }
    }



    class LoginPage extends StatefulWidget {

    final ValueChanged<String> onPressed;

    LoginPage({this.onPressed});

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

    class _LoginPageState extends State<LoginPage> {

    Widget build(BuildContext context) {

        return RaisedButton(
          child: Text("button"),
          onPressed: (){
            widget.onPressed("passing this data");
          },
        )

    }
    )
    }

Upvotes: 2

Related Questions