Добавление данных в список на другой странице Flutter - PullRequest
0 голосов
/ 07 мая 2020

У меня есть список имен событий в таком виджете с отслеживанием состояния

main.dart

class Fav extends StatefulWidget {
  @override
  _FavState createState() => _FavState();
}

class _FavState extends State<Fav> {
  final PageController ctrl = PageController(viewportFraction: 0.8);

  final Firestore db = Firestore.instance;
  Stream slides;

  var fav = ['3-Tech Event']; 
. 
.
.

И на другой странице я хочу добавить строку, скажем,

'5-Art Exhibit'

в

var fav = ['3-Tech Event'];

, чтобы получить окончательный результат

fav = ['3-Tech Event', '5-Art Exhibit'];

на странице выше. Как я могу это сделать? Вот мой код для кнопки

Event.dart

class Star extends StatefulWidget {
      @override
      _StarState createState() => _StarState();
    }

    class _StarState extends State<Star> {
      Color _iconColor = Colors.grey;

      @override
      Widget build(BuildContext context) {
        return Container(
              padding: EdgeInsets.all(55.0),
              child: Transform.scale(
                scale: 2.0,
                  child: IconButton(
                      icon: Icon(
                        Icons.star,
                        color: _iconColor,
                      ),
                      onPressed: () {
                        setState(() {
                          _iconColor = (_iconColor == Colors.yellow) ?  Colors.grey : Colors.yellow;

                        });
                      })
              ),
        );
      }
    }

Заранее спасибо!

ОБНОВЛЕНИЕ

Я последовал совету @Viren V Varasadiya и обновил свой код к этому

main.dart

class Fav extends StatefulWidget {

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

class _FavState extends State<Fav> {

  var fav = ['3-Tech Event'];
  updatedata(String item) {
    setState(() {
      fav.add(item);
    });
  }

А из другого файла я удалил класс Star (потому что он в любом случае предназначен для использования в другом классе), и он выглядел так

class Event extends StatefulWidget {
  final eventInfo;
  Event({Key key, List eventInfo})    //I have to pass a list of data to this 
      : this.eventInfo = eventInfo,   //page from another class
        super(key: key);

  final Function updatedata;
  Event.addToFavWith({this.updatedata});

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

class _EventState extends State<Event> {
  Color _iconColor = Colors.grey;

  @override
  Widget build(BuildContext context) {
.
.
.
Container(                          //This used to be Container(child:Star())
          child: InkWell(
        child: Container(
          padding: EdgeInsets.all(55.0),
          child: Transform.scale(
              scale: 2.0,
              child: IconButton(
                  icon: Icon(
                    Icons.star,
                    color: _iconColor,
                  ),
                  onPressed: () {
                    setState(() {
                      _iconColor = (_iconColor == Colors.yellow)
                          ? Colors.grey
                          : Colors.yellow;
                      widget.updatedata(name);
                    });
                  })),
        ),
      )),

И теперь я получите пару ошибок.

Все конечные переменные должны быть инициализированы, а 'eventInfo' - нет. Попробуйте добавить инициализатор для поля.

Все конечные переменные должны быть инициализированы, а «обновленные данные» - нет. Попробуйте добавить инициализатор для поля.

1 Ответ

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

Вы должны создать функцию в родительском виджете и передать ее дочернему виджету и вызвать ее в дочернем виджете, мы работаем для вас.

Следование минимальному коду поможет вам больше.

class DeleteWidget extends StatefulWidget {
  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

class _DeleteWidgetState extends State<DeleteWidget> {
  var fav = ['3-Tech Event'];

  updatedata(String item) {
    setState(() {
      fav.add(item);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
            child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text(fav.toString()),
        Star(
          updatedata: updatedata,
        ),
      ],
    )));
  }
}

class Star extends StatefulWidget {
  final Function updatedata;
  Star({this.updatedata});
  @override
  _StarState createState() => _StarState();
}

class _StarState extends State<Star> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
          child: Text("add item"),
          onPressed: () {
            widget.updatedata('5-Art Exhibit');
          }),
    );
  }
}

Обновление:

Нет необходимости создавать именованный конструктор.

class Event extends StatefulWidget {
  final eventInfo;
  Event({Key key, List eventInfo, this.updatedata})    //I have to pass a list of data to this 
      : this.eventInfo = eventInfo,   //page from another class
        super(key: key);

  final Function updatedata;

  @override
  _EventState createState() => _EventState();
}
...