Flutter: динамическое изменение заголовка панели приложений при переходе от указанной карты c на предыдущем экране - PullRequest
0 голосов
/ 06 мая 2020

Я новичок во Flutter и пытаюсь динамически изменить заголовок appBar экрана ввода на основе имени упражнения с карточкой, которое нажимается на предыдущем экране.

Например, если пользователь нажимает на карточку «Тяга штанги» (см. Ссылку на изображения ниже) - заголовок appBar экрана ввода станет «Тяга штанги».

Как лучше всего этого добиться?

Предыдущий экран карты

Экран ввода одной карты

Спасибо

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Попробуйте использовать приведенный ниже код. Работает отлично.

ПЕРВЫЙ ЭКРАН

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'First Screen'
        ),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            GestureDetector(
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (BuildContext context) => SecondScreen('Babel Row'),
                  ),
                );
              },
              child: Card(
                child: Container(
                  height: 100,
                  width: MediaQuery.of(context).size.width,
                  child: Center(child: Text('Babel Row')),
                ),
              ),
            ),
            SizedBox(height: 20,),
            GestureDetector(
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (BuildContext context) => SecondScreen('Bench Press'),
                  ),
                );
              },
              child: Card(
                child: Container(
                  height: 100,
                  width: MediaQuery.of(context).size.width,
                  child: Center(child: Text('Bench Press')),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

ВТОРОЙ ЭКРАН

class SecondScreen extends StatelessWidget {
  // define a string variable
  final String name;

  // create a constructor
  const SecondScreen(this.name);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // set the app bar title here
        title: Text(name),
      ),
      body: Center(
        child: Text(
          name,
          style: TextStyle(
            fontSize: 25,
            fontWeight: FontWeight.w500,
          ),
        ),
      ),
    );
  }
}

Вывод:

enter image description here

enter image description here

enter image description here


Надеюсь, это поможет.

0 голосов
/ 06 мая 2020

Это хороший способ передачи данных

class PreviousScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              navigate(context, "Hello");
            },
            child: Text("Hello"),
          ),
          RaisedButton(
            onPressed: () {
              navigate(context, "Bar Bell");
            },
            child: Text("Bar bell"),
          )
        ],
      ),
    );
  }

  void navigate(BuildContext context, String text){
    Navigator.push(context, MaterialPageRoute(builder: (context) => SignleCardInputScreen(text: text,)));
  }

}

class SignleCardInputScreen extends StatelessWidget {

final String text;

  const SignleCardInputScreen({Key key, this.text}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(text),
      ),
    );
  }
}

Хорошая практика - создать метод навигации, который принимает String, поскольку вы будете делать это более одного раза.

...