【问题标题】:Flutter: Add element in class A from class BFlutter:从B类中添加A类中的元素
【发布时间】:2021-05-26 06:11:15
【问题描述】:

我希望从类 B 中将一个项目添加到类 A 的列表中。

在课堂上使用按钮B

IconButton(
  icon: Icon(Icons.add),
  onPressed: () {
    print(element.tag);
    FirstScreenState().elementList.add(element.tag);
  }
)

我尝试将元素添加到 A 类中的列表中

class FirstScreenState extends State<FirstScreen> {
  List<String> elementList = List<String>();
}

但是当它试图打印列表时,它会打印一个空列表。为什么?

flutter: []

【问题讨论】:

  • 您的问题缺少信息和上下文。 A类和B类有什么关系吗?您不能简单地实例化一个 Widget 并从中调用一个方法,就好像它是一个单例一样。如果 B 类在导航堆栈中的下一个,在 A 类之后,那么您可以将该方法作为 B 类的构造函数的一部分传递。
  • 是的,A类在导航中在B类之前,A类是使用B类从用户那里收集的信息制作的屏幕,我不能通过构造函数发送信息,因为它不收集信息用户只有一次,每次我这样做时,都会重建类并且以前的信息消失

标签: list flutter oop dart


【解决方案1】:

为此,您需要使用全局密钥

首先,定义最终的 GlobalKey

<your list> _key = GlobalKey();

然后在onPressed函数中使用

_key.currentState.setTodo(Todo(title: _textFieldController.text));

然后将密钥添加到类

class yourClass extends StatefulWidget {
  yourClass({Key key}) : super(key: key);

最后,传递密钥

body: yourClass (
        key: _key,
      ),

更多详情请参考here

【讨论】:

    【解决方案2】:

    这里有一个例子,A 类的方法在 B 类中被调用,简单地将构造函数中的方法从 A 传递到 B,A 类也使用 GlobalKey 从 B 类调用方法。需要注意的是,GlobalKey 是用 B 类的状态类的类型声明的:

    class Home extends StatelessWidget {
      final GlobalKey<_ClassBState> classBKey = GlobalKey();
    
      @override
      Widget build(BuildContext context) {
        return Column(
          children: [
            ClassA(),
          ],
        );
      }
    }
    
    class ClassA extends StatelessWidget {
      final GlobalKey<_ClassBState> classBKey = GlobalKey();
    
       @override
      Widget build(BuildContext context) {
        return Container(
          alignment: Alignment.center,
          color: Colors.blueGrey,
          padding: EdgeInsets.all(10),
          child: Column(
            children: [
              Text('Class A'),
              RaisedButton(
                child: Text('Class B method'),
                onPressed: () => classBKey.currentState.methodInBClass(),
              ),
              ClassB(
                callback: methodInClassA,
                key: classBKey,
              ),
            ],
          ),
        );
      }
    
      void methodInClassA(){
        print('methodInClassA');
      }
    }
    
    class ClassB extends StatefulWidget {
      final Function callback;
    
      ClassB({
        Key key,
        this.callback,
      }) : super(key: key) ;
    
      @override
      _ClassBState createState() => _ClassBState();
    }
    
    class _ClassBState extends State<ClassB> {
      @override
      Widget build(BuildContext context) {
        return Container(
          alignment: Alignment.center,
          color: Colors.amber,
          padding: EdgeInsets.all(10),
          child: Column(
            children: [
              Text('Class B'),
              RaisedButton(
                child: Text('Class A method'),
                onPressed: () => widget.callback(),
              ),
            ]
          ),
        );
      }
    
      void methodInBClass(){
        print('methodInBClass');
      }
    }
    

    如果您希望我将每个概念单独分开,我可以更改代码。

    【讨论】:

    • 感谢您的回答,在尝试实施您的解决方案时,它返回给我The method 'addElement' was called on null.。两个班级都是StatefulWidget
    • 您已经分享了您在代码中提到的addElement 方法。我帮不了你。另外,您对为什么不能在构造函数中传递该方法的解释非常令人困惑“我无法通过构造函数发送信息,因为它不会仅在每次我这样做时从用户那里收集信息”,因为它确实不收集信息?
    • 我想通过class B的函数逐个元素填充class A中声明的列表,通过addElement函数添加元素后,我返回上一个屏幕(@987654328 @) 并再次启动该过程但数据不保留,两者都是statefulWidget
    猜你喜欢
    • 2015-09-07
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多