Как передавать и получать данные из StatelessWidget в другой?

#flutter #dart #statelesswidget

#flutter #dart #statelesswidget

Вопрос:

Когда я начал изучать flutter, я использую свои знания для создания базового калькулятора с этой платформой. Я обнаружил проблему в своем приложении… И это: как передавать параметры и информацию из одного виджета в другой? Особенно из одного виджета без состояния в другой. Я искал в разных местах, но я не понимаю, как я могу это сделать и как это работает.

Заранее благодарю всех вас, кто может объяснить мне об этом.

Это код, с которым я работаю:

 class CalcStructure extends StatelessWidget {

  final List<String> rowOne = ['AC', 'Del', '%', '/'];
  final List<String> rowTwo = ['7', '8', '9', '*'];
  final List<String> rowThree = ['4', '5', '6', '-'];
  final List<String> rowFour = ['1', '2', '3', ' '];
  final List<String> rowFive = ['00', '0', '.', '='];

  @override
  Widget build(BuildContext context) {
    return Column(
        children: <Widget>[
          Container(
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height * 0.44,
            color: Colors.red,
          ),
          RowStructure(),
          RowStructure(),
          RowStructure(),
          RowStructure(),
          RowStructure(),         
        ],
      );
  }
}
 

И класс RowStructure

 class RowStructure extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Row(
            children: <Widget>[
              Container(
                child: FlatButton(
                  onPressed: () => print('Pressed'), 
                  child: Text('AC'),
                ),
                width: MediaQuery.of(context).size.width * 0.25,
                height: MediaQuery.of(context).size.height * 0.09,
              ),
              Container(
                child: FlatButton(
                  onPressed: () => print('Pressed'), 
                  child: Text('AC'),
                ),
                width: MediaQuery.of(context).size.width * 0.25,
                height: MediaQuery.of(context).size.height * 0.09,
              ),
              Container(
                child: FlatButton(
                  onPressed: () => print('Pressed'), 
                  child: Text('AC'),
                ),
                width: MediaQuery.of(context).size.width * 0.25,
                height: MediaQuery.of(context).size.height * 0.09,
              ),
              Container(
                child: FlatButton(
                  onPressed: () => print('Pressed'), 
                  child: Text('AC'),
                ),
                width: MediaQuery.of(context).size.width * 0.25,
                height: MediaQuery.of(context).size.height * 0.09,
              ),
            ],
          );
  }
}
 

Идея состоит в том, чтобы передать каждый из списков (rowOne, rowTow …) в качестве параметров в другой класс, чтобы я мог повторно использовать код… Не могли бы вы мне помочь, пожалуйста?

Спасибо

Комментарии:

1. Взгляните на это: flutter.dev/docs/cookbook/navigation/passing-data . Хотя вы можете передавать данные из одного виджета в другой, вам придется использовать решение для управления состоянием, когда ваше приложение станет более сложным. Вы не можете просто передавать данные между пятью виджетами и ожидать, что все ваши виджеты будут обновляться при изменении этих данных. Я рекомендую обучающего провайдера вместо передачи этих данных: flutter.dev/docs/development/data-and-backend/state-mgmt / …

2. Используйте конструктор. Следите за этим блогом: medium.com/flutter/how-to-create-stateless-widgets-6f33931d859

3. «Передача данных из одного виджета в другой» всегда казалась мне странной, когда смотришь на это с точки зрения MVC. Виджеты — это представление и контроллер. Данные должны попадать в модель, чтобы различные контроллеры могли собирать то, что нужно их представлению. если вы передаете данные непосредственно из одного виджета в конструктор другого, будет сложнее имитировать значения и классы для тестирования.

Ответ №1:

Вы просто передаете данные / значение из одного класса виджетов в другой через конструктор:

 class RowStructure extends StatelessWidget {
  
  String text = "";
  VoidCallback onTap;
  
  RowStructure({ this.text, this.onTap });
  
  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Container(
          child: FlatButton(
            onPressed: onTap,
            child: Text(text),
          ),