всем! Я пытаюсь понять, как использовать провайдер 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)