ошибка: метод setState не определен для типа TasksScreen. (undefined_method в [todoey] lib / screen / tasks_screen.dart: 26) - PullRequest
0 голосов
/ 10 июля 2020

Итак, я пытаюсь использовать обратный вызов, чтобы добавить задачу в свой список задач. Но я не могу получить доступ к setState () в моей функции обратного вызова. Позвольте мне объяснить,

Это мой add_task_screen, содержащий мой modalBottomSheet.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class AddTaskScreen extends StatelessWidget {

  String newTaskText;
  final Function addNewTask;
  AddTaskScreen({@required this.addNewTask});

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Padding(
        padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
        child: Container(
          color: Color(0xFF757575),
          child: Container(
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.only(
                topLeft: Radius.circular(20.0),
                topRight: Radius.circular(20.0),
              )
            ),
            child: Padding(
              padding: EdgeInsets.symmetric(horizontal: 65.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.only(top: 15.0),
                    child: Text(
                      'Add Task',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        color: Colors.lightBlueAccent,
                        fontSize: 30.0
                      ),
                    ),
                  ),
                  TextField(
                    style: TextStyle(fontSize: 22.0 ),
                    autofocus: true,
                    textAlign: TextAlign.center,
                    onChanged: (value) {
                      newTaskText = value;
                    },
                  ),
                  SizedBox(
                    height: 15.0,
                  ),
                  FlatButton(
                    color: Colors.lightBlueAccent,
                    child: Text(
                      'Add',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 20.0,
                      ),
                    ),
                    onPressed: () {
                      addNewTask(newTaskText);
                    },
                  )
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

Итак, когда я нажимаю «Добавить», я хочу добавить свою задачу в свою задачу - список. но используя обратный вызов, просто чтобы обновить другие части моего приложения. Итак, я использую обратный вызов в tasks_screen, который является родительским элементом страницы add_tasks. Вот моя страница tasks_screen,

import 'package:flutter/material.dart';
import 'package:todoey/widgets/tasks_list.dart';
import 'package:todoey/screens/add_task_screen.dart';
import 'package:todoey/models/task.dart';

class TasksScreen extends StatelessWidget {

  List<Task> tasks = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.lightBlueAccent,
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.lightBlueAccent,
        child: Icon(Icons.add, size: 40.0),
        onPressed: () {
          showModalBottomSheet(
            context: context,
            builder: (context) => AddTaskScreen(
              addNewTask: (String newTaskText) {

                print(newTaskText);
                tasks.add(Task(taskText: newTaskText));
                
// FIXME: Some issue here...
                setState(() {
                  tasks.add(Task(taskText: newTaskText));
                });
                Navigator.pop(context);

              },
            ),
            isScrollControlled: true
          );
        },
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Container(
            padding: EdgeInsets.only(top: 60.0, left: 30, right: 30.0, bottom: 30.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                CircleAvatar(
                  child: Icon(Icons.list, size: 30.0, color: Colors.lightBlueAccent,),
                  backgroundColor: Colors.white,
                  radius: 30.0,
                ),
                SizedBox(
                  height: 10.0,
                ),
                Text(
                  'Todoey',
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 50.0,
                    fontWeight: FontWeight.w700,
                  ),
                ),
                Text(
                  '12 Tasks',
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 18.0,
                  ),
                ),
              ],
            ),
          ),
          Expanded(
            child: Container(
              padding: EdgeInsets.symmetric(horizontal: 20.0),
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.only(
                    topRight: Radius.circular(20.0),
                    topLeft: Radius.circular(20.0)
                ),
              ),
              child: TasksList(tasks: tasks),
            ),
          ),
        ],
      ),
    );
  }
}

Итак, я получаю сообщение об ошибке в setState () под комментарием FIXME. Ошибка - это заголовок вопроса. Ирония заключается в том, что задача печатается на моей консоли. Но когда я пытаюсь изменить состояние, чтобы добавить задачу в свой список задач, а затем выскакивать из bottomSheet, я получаю сообщение об ошибке. Примечание. Задача - это модель.

Подскажите пожалуйста, как это исправить. Заранее спасибо.

1 Ответ

0 голосов
/ 10 июля 2020

Пришлось преобразовать t.ask_screen в Stateful Widget [решено]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...