Flutter Navigator.pop не будет отправлять данные обратно - PullRequest
0 голосов
/ 29 января 2020

Пока это мой код. Я не знаю, что не так, я пробовал много youtube turolial и других вещей, но похоже, что поп не вернет правильные данные. Мне действительно нужна помощь, я провожу уже 2 дня

void main() {
  List<String> names = [];
  List<String> mgs = [];

  runApp(MaterialApp(
    title: 'Returning Data',
    home: HomeScreen(names, mgs),
  ));
}

class HomeScreen extends StatelessWidget {
  List<String> names = [];
  List<String> mgs = [];

  HomeScreen(this.names, this.mgs);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blue,
        title: Text("Project_Drink"),

      ),
      body: Container(
        child: Column(
          children: <Widget>[
            new Expanded(
                child:  ListView.builder
                  (
                    itemCount: mgs.length,
                    itemBuilder: (context, Index) {
                      return Text("Name: " + names[Index]
                          +" "+ "Mg: " + mgs[Index]);
                    }
                )
            )


          ],

        ),


      ),


      bottomNavigationBar :BottomAppBar  (

        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Row(
            children: <Widget>[
              const Expanded(child: Text("TOTAL : 200")),
              FloatingActionButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => AddProduct()),
                  );
                },
                child: Icon(Icons.add),

              ),


            ],
          ),
        ),
      ),

    );
  }

}

Это AddProduct, я хочу, чтобы он отправлял обратно данные, а затем я мог бы внести их в список. *


class AddProduct extends StatefulWidget {
  @override
  State createState() => new _AddProductState();
}


class _AddProductState extends State<AddProduct> {
  List<String> names = [];
  List<String> mgs = [];


  //final TextEditingController eCtrl = new TextEditingController();
  final nameController = TextEditingController();
  final mgController = TextEditingController();


  @override
  Widget build (BuildContext ctxt) {
    return new Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.blue,
          title: Text("New Drink"),

        ),

        body: new Column(
          children: <Widget>[
            new TextField(
              decoration: InputDecoration(
                hintText: "Name",
              ),
              controller: nameController,

            ),

            new TextField(
              decoration: InputDecoration(
                hintText: "Mg",
                suffixText: "Mg",
              ),
              controller: mgController,

            ),
            RaisedButton(
              onPressed: (){
                names.add(nameController.text);
                mgs.add(mgController.text);
                setState(() {});
                nameController.clear();
                mgController.clear();
                Navigator.pop(context, names + mgs);

              },
              child: Text("ADD"),

            ),

          ],
        )
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 29 января 2020

попробуйте этот простой способ, когда нажмите, затем вызовите этот метод

 goToView() async {
bool data=await   Navigator.push(context, new CupertinoPageRoute(builder:   (BuildContext context) {
  return new CoolForgot();
}));
 print(data);
  }

Мой следующий вид - это экран "Забыл", поэтому я использовал CoolForgot (), вы можете использовать его согласно вашему требованию.

затем при нажатии кнопки «Назад» в следующем представлении (в моем случае CoolForgot ()) это называется

 Navigator.pop(context,true);

У меня есть значение pass bool и значение bool, вы можете передать любой тип объекта и получить из него.

0 голосов
/ 29 января 2020

Я переместил ваши списки в HomeScreen виджет вместо функции main. Ваша основная функция должна просто запустить приложение

void main() {
  runApp(
    MaterialApp(
      title: 'Returning Data',
      home: HomeScreen(),
    ),
  );
}

И я преобразую ваш HomeScreen виджет в StatefulWidget вместо StatelessWidget, потому что когда вы добавляете новые элементы и отображаете их на экране, ваше состояние будет меняться и StatelessWidget не может этого сделать. Это будет что-то вроде этого

Navigator.push возвращает будущее значение, поэтому, если вы хотите объявить переменную с данными, полученными из этого, вам нужно дождаться ее. После получения данных вы можете добавить их в свои списки, но они должны быть внутри функции setState для обновления пользовательского интерфейса

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<String> names = [];
  List<String> mgs = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blue,
        title: Text("Project_Drink"),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            new Expanded(
                child:  ListView.builder(
                  itemCount: mgs.length,
                  itemBuilder: (context, index) {
                    return Text("Name: " + names[index] + " " + "Mg: " + mgs[index]);
                  }
                ),
            ),
          ],
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Row(
            children: <Widget>[
              Expanded(child: Text("TOTAL : 200")),
              FloatingActionButton(
                onPressed: () async {
                  // Navigator.push returns a future value so you need to await for it 
                  var data = await Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => AddProduct()),
                  );
                  // After you get the data from the other page you need to add them into your lists inside setState function to update UI
                  setState(() {
                    names.add(data[0]);
                    mgs.add(data[1]);
                  });
                },
                child: Icon(Icons.add),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Я ничего не изменил в вашем виджете AddProduct.

class AddProduct extends StatefulWidget {
  @override
  State createState() => new _AddProductState();
}


class _AddProductState extends State<AddProduct> {
  List<String> names = [];
  List<String> mgs = [];

  //final TextEditingController eCtrl = new TextEditingController();
  final nameController = TextEditingController();
  final mgController = TextEditingController();

  @override
  Widget build (BuildContext ctxt) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.blue,
          title: Text("New Drink"),
        ),
        body: Column(
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                hintText: "Name",
              ),
              controller: nameController,
            ),
            TextField(
              decoration: InputDecoration(
                hintText: "Mg",
                suffixText: "Mg",
              ),
              controller: mgController,
            ),
            RaisedButton(
              onPressed: (){
                names.add(nameController.text);
                mgs.add(mgController.text);
                setState(() {});
                nameController.clear();
                mgController.clear();
                Navigator.pop(context, names + mgs);
              },
              child: Text("ADD"),
            ),
          ],
        )
    );
  }
}

Хотя этот код должен работать так, как вы хотите, я бы посоветовал вам взглянуть на некоторые методы управления состоянием, такие как Provider, Blo c и др. c. Будет эффективнее создавать то, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...