#flutter #dart #flutter-layout
#flutter #dart #flutter-layout
Вопрос:
Я новичок в Flutter и работаю над простым приложением списка задач. Для домашней страницы я хотел бы иметь список элементов задач и кнопку для добавления нового элемента задач. Нажатие кнопки «создать» должно вызвать окно для ввода заголовка для элемента задач и добавления приоритета из 1-5 с помощью моих пользовательских переключателей. Нажатие кнопки отправки / отправки в этом окне должно добавить его в список элементов задач (отображаемых в ListView).
Я получаю эту ошибку: type ‘(String, ItemPriority) => void’ не является подтипом типа ‘(String, [ItemPriority]) => dynamic’
Это происходит из строки 79 «TodoInputWidget(this.newTodoItem)», и я попытался отследить причину ошибки, но я не уверен, что полностью ее понимаю. Я не могу найти нигде, что создавало бы список ITEMPRIORITY .
Я действительно ценю любую информацию по этому вопросу!
Вот код, который у меня есть прямо сейчас:
import 'package:flutter/material.dart';
import 'textInputWidget.dart';
void main() {
runApp(MyApp());
}
enum ItemPriority { low, low_med, med, med_high, high }
extension ItemPriorityExtension on ItemPriority {
RadioModel get radio {
switch (this) {
case ItemPriority.low:
return new RadioModel(true, '1', Colors.green);
case ItemPriority.low_med:
return new RadioModel(true, '2', Colors.lightGreen);
case ItemPriority.med:
return new RadioModel(true, '3', Colors.yellow);
case ItemPriority.med_high:
return new RadioModel(true, '2', Colors.orange);
case ItemPriority.high:
return new RadioModel(true, '2', Colors.red);
default:
return new RadioModel(true, '3', Colors.yellow);
}
}
}
class TodoItem {
String task;
ItemPriority priority;
TodoItem(this.task, this.priority);
}
class RadioModel {
bool isSelected;
String radioNumText;
Color color;
RadioModel(this.isSelected, this.radioNumText, this.color);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Weekly ToDo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<TodoItem> todos = [];
void newTodoItem(String text, ItemPriority priority) {
this.setState(() {
todos.add(new TodoItem(text, priority));
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Weekly ToDo')),
body: Column(
children: <Widget>[
Expanded(child: TodoList(this.todos)),
TodoInputWidget(this.newTodoItem),
],
),
);
}
}
class TodoInputWidget extends StatefulWidget {
final Function(String, [ItemPriority]) callback;
TodoInputWidget(this.callback);
@override
_TodoInputWidgetState createState() => _TodoInputWidgetState();
}
class _TodoInputWidgetState extends State<TodoInputWidget> {
String text;
ItemPriority priority;
CustomRadio radio = new CustomRadio(ItemPriority.med);
bool selected = false;
void createTodo(String text) {
this.setState(() {
widget.callback(text, radio.priority);
});
}
createTodoWindow(BuildContext context) {
return showDialog(
context: context,
builder: (context) => SimpleDialog(
title: Text('Create new task'),
children: <Widget>[radio, TextInputWidget(this.createTodo)],
));
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
createTodoWindow(context);
},
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.green,
),
),
);
}
}
class TodoList extends StatefulWidget {
final List<TodoItem> todoItems;
TodoList(this.todoItems);
@override
_TodoListState createState() => _TodoListState();
}
class _TodoListState extends State<TodoList> {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: this.widget.todoItems.length,
itemBuilder: (context, index) {
var todoItem = this.widget.todoItems[index];
return ListTile(title: Text(todoItem.task));
},
);
}
}
class RadioItem extends StatelessWidget {
final RadioModel item;
RadioItem(this.item);
@override
Widget build(BuildContext context) {
return Container(
child: Text(item.radioNumText),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: item.color,
),
alignment: Alignment.center,
);
}
}
//ignore: must_be_immutable
class CustomRadio extends StatefulWidget {
ItemPriority priority;
CustomRadio(this.priority);
@override
_CustomRadioState createState() => _CustomRadioState();
}
class _CustomRadioState extends State<CustomRadio> {
List<RadioModel> priorityChoices = new List<RadioModel>();
ItemPriority priority;
@override
void initState() {
super.initState();
widget.priority = priority;
priorityChoices.add(ItemPriority.low.radio);
priorityChoices.add(ItemPriority.low_med.radio);
priorityChoices.add(ItemPriority.med.radio);
priorityChoices.add(ItemPriority.med_high.radio);
priorityChoices.add(ItemPriority.high.radio);
}
@override
Widget build(BuildContext context) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: priorityChoices.length,
itemBuilder: (context, index) {
return IconButton(
onPressed: () {
priorityChoices.forEach((element) {
element.isSelected = false;
});
priorityChoices[index].isSelected = true;
priority = ItemPriority.values[index];
},
icon: RadioItem(priorityChoices[index]),
);
},
);
}
}
Ответ №1:
Заменить функцию ;
dynamic newTodoItem(String text, [ItemPriority priority]) {
this.setState(() {
todos.add(new TodoItem(text, priority));
});
return some.. or null;
}