【问题标题】:Access and modify parameter from another class从另一个类访问和修改参数
【发布时间】:2019-11-13 19:02:49
【问题描述】:

我开始尝试从头开始构建一个简单的 ToDo 应用程序,而不是基于任何教程,因此我可以更好地学习,但现在我无法从等效的小部件访问 todos 数组。 .

为了让事情井井有条,我有以下结构:

lib
  pages
    home.page.dart
  widgets
    todo-card.dart
    todo-empty.dart
  main.dart

该应用程序是每个待办事项的卡片列表和用于创建新待办事项的 FAB。每张卡片都是一个删除按钮、待办事项文本的一部分和一个检查按钮。所有的待办事项都存储在 HomePage 类中:

pages/home.page.dart

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List todos = [
    {'text': 'texto teste 1', 'checked': false},
    {'text': 'texto teste 2', 'checked': true},
    {'text': 'texto teste 3', 'checked': false},
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        ...
      ),
      backgroundColor: Theme.of(context).primaryColor,
      body: this.todos.length > 0
          ? ListView.builder(
              itemCount: this.todos.length,
              itemBuilder: (context, index) {
                Map item = this.todos[index];

                return TodoCard(item['text'], item['checked']);
              },
            )
          : TodoEmpty(),
      floatingActionButton: FloatingActionButton(
        ...
      ),
    );
  }
}

卡牌结构: 小部件/todo-card.dart

class TodoCard extends StatefulWidget {
  String text;
  bool checked = false;

  TodoCard(this.text, [this.checked = false]);

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

class _TodoCardState extends State<TodoCard> {
  @override
  Widget build(BuildContext context) {
    return Card(
      child: Container(
        padding: EdgeInsets.all(20),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            IconButton(
              icon: Icon(Icons.delete),
              onPressed: () {

              },
            ),
            Expanded(
              child: Text(
                widget.text,
              ),
            ),
            IconButton(
              icon: widget.checked
                  ? Icon(Icons.check_box)
                  : Icon(Icons.check_box_outline_blank),
              onPressed: () {
                setState(() {
                  if (widget.checked == true) {
                    widget.checked = false;
                  } else {
                    widget.checked = true;
                  }
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

我的问题是:如何从TodoCard 类中访问和删除HomePage 属性,以便从todos 列表中删除索引?

目前我不想使用 bloc、provider 或其他类似工具。由于我开始使用 Flutter,我想先掌握 setState()

Project repository on Github

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您可以像这样将函数作为参数传递给 TodoCard 类

    class TodoCard extends StatefulWidget {
      String text;
      bool checked = false;
      Function onTodoCardDeleted;
    
      TodoCard(this.text, this.onTodoCardDeleted, [this.checked = false]);
    
      @override
      _TodoCardState createState() => _TodoCardState();
    }
    

    在 HomePage 中,您将像这样创建 TodoCard 对象

    /* your code */
    itemBuilder: (context, index) {
      Map item = this.todos[index];
      return TodoCard(item['text'], (){ _removeFromTodos(index); }, item['checked']);
    },
    /* your code */
    
    _removeFromTodos(int index){
      setState((){
        todos.removeAt(index);
      });
    }
    

    最后你可以在删除图标点击上调用作为参数传递的函数

    IconButton(
      icon: Icon(Icons.delete),
      onPressed: () {
        widget.onTodoCardDeleted;
      },
    ),
    

    【讨论】:

    • 成功了!非常感谢!我唯一需要改变的是:widget.onTodoCardDeleted; 到:widget.onTodoCardDeleted();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多