【问题标题】:Adding data to a list on another page Flutter将数据添加到另一个页面上的列表 Flutter
【发布时间】:2020-05-07 17:41:12
【问题描述】:

我在这样的有状态小部件中有一个事件名称列表

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' 不是。尝试 为该字段添加一个初始化器。

所有最终变量都必须初始化,但“updatedata”不是。尝试 为该字段添加一个初始化程序。

【问题讨论】:

  • 让我更清楚。你想更新明星的最爱吗?你在那个类(fav)中使用星形小部件吗?如果是,那么也添加那部分代码。
  • 当您导航到一个新函数时,您可以传递一个函数,该函数接受事件名称的参数并将其添加到列表中。在第二页可以调用这个函数参考
  • 是的,我想通过按星形图标来更新收藏。小部件 Star 不在 Fav 中,但它在单独的 dart 文件中。 @VirenVVarasadiya 如何从不同的 dart 文件中调用函数? @阿巴斯

标签: flutter dart


【解决方案1】:

您必须在父小部件中创建一个函数并将其传递给子小部件并在子小部件中调用它,我们为您工作。

遵循最少的代码可以帮助您更多。

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();
}

【讨论】:

  • 我试过这个,但它不起作用。我在调试控制台中得到了这个type 'String' is not a subtype of type 'Function'我不明白。我们不是只是尝试将字符串传递给函数吗?
  • 你在说我的演示吗?因为我的演示运行良好。
  • 不,我将updatedata final Function updatedata; Star({this.updatedata}); 像您的示例一样添加到我的代码中。是因为我的 Star 类和 Fav 类在不同的文件中吗?我不明白这个功能是如何工作的。很抱歉我刚开始学习 Flutter。
  • 不同文件中的代码无关紧要。您能根据当前情况更新您的问题吗?所以我变得很容易理解,并在更新中添加了更多你想要什么以及如何更新的细节。 @BookTeeranai
  • 您必须在调用该小部件的位置传递 updatedata 函数。 @BookTeeranai
猜你喜欢
  • 2019-07-19
  • 1970-01-01
  • 2021-12-20
  • 2010-11-22
  • 2021-03-30
  • 1970-01-01
  • 2020-04-02
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多