How to send data without going to other screen in flutter pageview?

Viewed 37

I want to send data from one page to other in pageview without going to other page I only want to save it somewhere and use this in other page.

Here is the HomeScreen Code :

class home extends StatefulWidget {


home({Key? key}) : super(key: key);



@override
  State<home> createState() => _homeState();
}

PageController controller = PageController();
int _index = 0;

class _homeState extends State<home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // extendBody: true,
      body: PageView(
        controller: controller,
        children: [
          page(
            controller: controller,
          ),
          codechef(),
          codeforce(sub: ""),
        ],
        onPageChanged: (page) {
          setState(() {
            _index = page;
          });
          controller.jumpToPage(_index);
        },
      ),
      bottomNavigationBar: Container(
        color: Color.fromARGB(255, 19, 63, 99),
        child: Padding(
          padding: const EdgeInsets.all(8),
          child: GNav(
            tabs: [
              GButton(
                icon: Icons.home,
                text: "Home",
              ),
              GButton(
                icon: Cp.codechef_svgrepo_com,
                text: "CodeChef",
              ),
              GButton(
                icon: Cp.codeforces_svgrepo_com,
                text: "CodeForces",
              )
            ],
            onTabChange: (index) {
              setState(() {
                _index = index;
              });
              controller.jumpToPage(index);
            },
            color: Colors.green,
            backgroundColor: Color.fromARGB(255, 22, 64, 98),
            activeColor: Colors.white,
            tabBackgroundColor: Color.fromARGB(255, 18, 44, 65),
            gap: 20,
            padding: EdgeInsets.all(20),
            rippleColor: Color.fromARGB(255, 51, 23, 23),
            selectedIndex: _index,
          ),
        ),
      ),
    );
  }
}

Here is the page() code:

import 'package:flutter/material.dart';

    class page extends StatefulWidget {
  PageController controller = PageController();
  page({Key? key, required this.controller}) : super(key: key);

  @override
  State<page> createState() => _pageState();
}

class _pageState extends State<page> {
  TextEditingController _textFieldController = TextEditingController();

  late String codeDialog;
  late String valueText;
  bool en = false;
  Future<void> _displayTextInputDialog(BuildContext context) {
    return showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            backgroundColor: Color.fromARGB(255, 55, 74, 90),
            title: Text(
              'UserName',
              style: TextStyle(color: Colors.white),
            ),
            content: TextFormField(
              onChanged: (value) {
                setState(() {
                  valueText = value;
                });
              },
              controller: _textFieldController,
              decoration: InputDecoration(
                hintText: "Enter a valid user name",
                hintStyle: TextStyle(color: Colors.white),
              ),
              style: TextStyle(
                color: Colors.white,
              ),
              validator: (Value) {
                if (Value!.isEmpty || Value == null) {
                  return "Enter User name";
                }
              },
            ),
            actions: <Widget>[
              ElevatedButton(
                child: Text(
                  'CANCEL',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () {
                  setState(() {
                    Navigator.pop(context);
                  });
                },
                style: ElevatedButton.styleFrom(primary: Colors.red),
              ),
              ElevatedButton(
                child: Text(
                  'OK',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () {
                  setState(() {
                    en = true;
                    codeDialog = valueText;
                    MaterialPageRoute(
                        builder: (context) => codeforce(sub: codeDialog));
                    controller.jumpToPage(2);

                    Navigator.pop(context);
                  });
                },
                style: ElevatedButton.styleFrom(primary: Colors.green),
              ),
            ],
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Container(
        child: Center(
          child: GridView(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2, crossAxisSpacing: 10),
            children: [
              Container(
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: Color.fromARGB(255, 97, 78, 78)),
                child: Column(
                  children: [
                    Icon(
                      Cp.codechef_svgrepo_com,
                      size: 100,
                    ),
                    Text("CodeChef",
                        style: TextStyle(
                          fontSize: 20,
                          fontWeight: FontWeight.bold,
                          color: Color.fromARGB(255, 166, 201, 229),
                        ))
                  ],
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  crossAxisAlignment: CrossAxisAlignment.center,
                ),
              ),
              InkWell(
                onTap: () async {
                  await _displayTextInputDialog(context);
                },
                child: Container(
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(10),
                      color: Color.fromARGB(255, 40, 83, 118)),
                  child: Column(
                    children: [
                      Icon(
                        Cp.codeforces_svgrepo_com,
                        size: 100,
                      ),
                      Text(
                        "CodeForces",
                        style: TextStyle(
                            fontSize: 20,
                            fontWeight: FontWeight.bold,
                            color: Color.fromARGB(255, 166, 201, 229)),
                      ),
                      en ? Text(codeDialog) : Text("")
                    ],
                    mainAxisAlignment: MainAxisAlignment.center,
                  ),
                ),
              )
            ],
            shrinkWrap: true,
          ),
        ),
      ),
    );
  }
}

Here I want when someone enter data and click on OK button then it should go to the codeforce page which take string. but when I am using Navigator.push() it will replace my screen but that I do not want. I want it to slide to codeforce page and write the data on it.

3 Answers

Make the page widget take the callback function e.g. onSave:

final void Function(String data) onSave;

If the data you want to save is String. Otherwise use other type.

Then in the parent widget (home I think) use page like that:

page(
  onSave: (String data) {
    // Do your magic here (probably set some state)
  },
)

Also name classes from the big letter like this: Page. This is very important convention.

It's a quick fix but finally You want some state management like BLoC or GetX.

As the other users already stated:

The best solution is to learn a StateManagement tool.

I would suggest learning Provider and then later RiverPod. Since instead of GetX these Solutions are in the concept of WidgetTree and follow unidirectional dataflow.

If you are planning to go enterprise level of code i suggest learning Bloc.

and then combine the 2 RiverBloc

Otherwise just create a toplevel String Variable and pass it down the constructors(This gets messy very fast).

Use GetStoragehere Its very easy to use:

Writing values:

box.write('quote', 'GetX is the best');

Reading Values:

box.read('quote');
Related