Flutter - упражнение Provier - «Строка не является подтипом MyClass» - PullRequest
0 голосов
/ 28 мая 2020

всем! Я пытаюсь понять, как использовать провайдер Flutter, и борюсь с проблемами типа. В этом упражнении я создал первый экран, который показывает подэкран моего списка дел. Подэкран ToDo List имеет навигатор, который ведет к подэкрану NewToDo с TextField, который возвращает новую задачу в виде строки. Но я получаю сообщение об ошибке при попытке .then () добавить строку в мой список. Кто-нибудь может помочь мне разобраться в проблеме? Любое мнение приветствуется. PS: Я не использую setState (), потому что думаю, что notifierListener () позаботится о рендеринге представления с новым состоянием. Я прав?

Заранее спасибо.

Ошибка, как показано в ВЫВОДЕ

E/flutter (32309): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: type 'String' is not a subtype of type 'MyTask'

Экран списка дел

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:teamz/MyNewToDo.dart';

//modelo lista - lista tareas
//task: task
//category: string, photo, audio
class MyTask {
  String task, category;
  bool done;
  MyTask(this.task)
      : category = 'toDo',
        done = false;
}

//task list w/logic
class MyTasks extends ChangeNotifier {
  List selected; //selected items in _list
  MyTask task = MyTask('');
  List<MyTask> _list = [];

  void addTask(task) {
    _list.add(task);
    print('tasks length ${_list.length}');
    notifyListeners();
  }

  void removeSelected(selected) {
    //
  }

  void removeAll() {
    _list.clear();
    notifyListeners();
  }
}

class MyToDo extends StatefulWidget {
  @override
  _MyToDoState createState() => _MyToDoState();
}

class _MyToDoState extends State<MyToDo> {
  MyTasks tasks = MyTasks();

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => MyTasks(),
      child: Scaffold(
        body: Consumer<MyTasks>(
          builder: (context, tasks, child) => Center(
            child: child,
          ),
          //If tasks list is empty, show text
          child: (tasks._list.length > 0
              ? ListView.builder(
                  itemCount: tasks._list.length,
                  itemBuilder: (context, index) => InkWell(
                    child: CheckboxListTile(
                        title: Text(tasks._list[index].task),
                        value: tasks._list[index].done,
                        onChanged: null),
                  ),
                )
              : Text('Create a new task')), //if
        ),
        floatingActionButton: FloatingActionButton(child: Icon(Icons.add),
          onPressed:() => Navigator.of(context).push(MaterialPageRoute(
            builder: (context) => MyNewToDo(),
          )).then((value) {
              value.toString();
              tasks.addTask(value); 
          }),
        )),
    );
  }
}

Новый экран ввода ToDo

import 'package:flutter/material.dart';

class MyNewToDo extends StatefulWidget {
  @override
  _MyNewToDoState createState() => _MyNewToDoState();
}

class _MyNewToDoState extends State<MyNewToDo> {
  TextEditingController _controlador;

  @override
  void initState() {
    _controlador = TextEditingController();
    super.initState();
  }

  @override
  void dispose() {
    _controlador.dispose();
    super.dispose();
  }

  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: EdgeInsets.fromLTRB(20.0, 80.0, 20.0, 0.0),
        child: Column(
          children: <Widget>[
            TextField(
              controller: _controlador,
              onSubmitted: (todo) {
                Navigator.of(context).pop(todo);
              },
            ),
            RaisedButton(
                child: Text('Nueva tarea'),
                onPressed: () {
                  Navigator.of(context).pop(_controlador.text);
                }),
          ],
        ),
      ),
    );
  }
}

Вывод

W/IInputConnectionWrapper(32309): getTextBeforeCursor on inactive InputConnection
E/flutter (32309): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: type 'String' is not a subtype of type 'MyTask'
E/flutter (32309): #3      _CustomZone.runUnary  (dart:async/zone.dart:1085:19)
E/flutter (32309): #4      _FutureListener.handleValue  (dart:async/future_impl.dart:141:18)
E/flutter (32309): #5      Future._propagateToListeners.handleValueCallback  (dart:async/future_impl.dart:682:45)
E/flutter (32309): #6      Future._propagateToListeners  (dart:async/future_impl.dart:711:32)
E/flutter (32309): #7      Future._completeWithValue  (dart:async/future_impl.dart:526:5)
E/flutter (32309): #8      Future._asyncComplete.<anonymous closure>  (dart:async/future_impl.dart:556:7)
E/flutter (32309): #9      _rootRun  (dart:async/zone.dart:1184:13)
E/flutter (32309): #10     _CustomZone.run  (dart:async/zone.dart:1077:19)
E/flutter (32309): #11     _CustomZone.runGuarded  (dart:async/zone.dart:979:7)
E/flutter (32309): #12     _CustomZone.bindCallbackGuarded.<anonymous closure>  (dart:async/zone.dart:1019:23)
E/flutter (32309): #13     _microtaskLoop  (dart:async/schedule_microtask.dart:43:21)
E/flutter (32309): #14     _startMicrotaskLoop  (dart:async/schedule_microtask.dart:52:5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...