Flutter 从另一个类访问和修改参数

Flutter 从另一个类访问和修改参数,flutter,Flutter,我从Flatter开发开始,尝试从头开始构建一个简单的ToDo应用程序,而不是基于任何教程,这样我可以学得更好,但现在我无法从等效的小部件访问ToDo数组 为了使事情有条理,我有以下结构: lib pages home.page.dart widgets todo-card.dart todo-empty.dart main.dart 该应用程序是每个待办事项的卡片列表和创建新待办事项的FAB。每张卡片都是一个删除按钮、todo文本的一部分和一个检查按钮。所

我从Flatter开发开始,尝试从头开始构建一个简单的ToDo应用程序,而不是基于任何教程,这样我可以学得更好,但现在我无法从等效的小部件访问ToDo数组

为了使事情有条理,我有以下结构:

lib
  pages
    home.page.dart
  widgets
    todo-card.dart
    todo-empty.dart
  main.dart
该应用程序是每个待办事项的卡片列表和创建新待办事项的FAB。每张卡片都是一个删除按钮、todo文本的一部分和一个检查按钮。所有TODO项目都存储在HomePage类中:

页面/主页.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(
        ...
      ),
    );
  }
}
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;
                  }
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}
类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
列出待办事项=[
{'text':'texto teste 1','checked':false},
{'text':'texto teste 2','checked':true},
{'text':'texto teste 3','checked':false},
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
...
),
背景色:主题。背景色,
正文:this.todos.length>0
?ListView.builder(
itemCount:this.todos.length,
itemBuilder:(上下文,索引){
Map item=this.todos[index];
返回到文档(项目['text'],项目['checked']);
},
)
:TodoEmpty(),
浮动操作按钮:浮动操作按钮(
...
),
);
}
}
以及卡片结构: widgets/todo card.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(
        ...
      ),
    );
  }
}
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扩展StatefulWidget{
字符串文本;
bool checked=false;
TodoCard(this.text[this.checked=false]);
@凌驾
_TodoCardState createState()=>U TodoCardState();
}
类_ToCardState扩展了状态{
@凌驾
小部件构建(构建上下文){
回程卡(
子:容器(
填充:边缘设置。全部(20),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
图标按钮(
图标:图标(Icons.delete),
已按下:(){
},
),
扩大(
子:文本(
widget.text,
),
),
图标按钮(
图标:widget.checked
?图标(图标。复选框)
:图标(图标。复选框\轮廓\空白),
已按下:(){
设置状态(){
if(widget.checked==true){
widget.checked=false;
}否则{
widget.checked=true;
}
});
},
),
],
),
),
);
}
}
我的问题是:如何从
TodoCard
类访问和删除
HomePage
属性,以便从
todos
列表中删除索引?

现在我不想使用bloc、provider或其他类似的工具。由于我刚开始学习颤振,我想先掌握
setState()


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

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

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

  @override
  _TodoCardState createState() => _TodoCardState();
}
/* 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);
  });
}
在主页中,您可以像这样创建TodoCard对象

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

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

  @override
  _TodoCardState createState() => _TodoCardState();
}
/* 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
to:
widget.onTodoCardDeleted()