flutter - flutter 错误: '(String, ItemPriority) => void'类型不是 '(String, [ItemPriority]) => dynamic'类型的子类型

标签 flutter dart flutter-layout

我是Flutter的新手,正在开发一个简单的待办事项列表应用程序。对于主页,我想要一个待办事项列表和一个添加新待办事项的按钮。轻按“新建”按钮,将弹出一个窗口,为待办事项键入标题,并使用我的自定义单选按钮在1-5中添加优先级。单击此窗口上的发送/提交按钮,应将其添加到待办事项列表(显示在ListView中)。
我收到此错误:类型'((String,ItemPriority)=> void'不是类型'(String,[ItemPriority])=>动态'的子类型
它来自第79行“TodoInputWidget(this.newTodoItem)”,我试图跟踪错误的原因,但我不确定我是否完全理解它。我找不到任何会产生ItemPrioritys列表的地方。
我非常感谢您对此问题有任何见解!
这是我现在拥有的代码:

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]),
        );
      },
    );
  }
}

最佳答案

替换功能;

  dynamic newTodoItem(String text, [ItemPriority priority]) {
     this.setState(() {
       todos.add(new TodoItem(text, priority));
     });
     return some.. or null;
  }

关于flutter - flutter 错误: '(String, ItemPriority) => void'类型不是 '(String, [ItemPriority]) => dynamic'类型的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64624628/

相关文章:

flutter - Flutter 中的 JWT/RefreshToken 与 ExpiredTokenRetryPolicy/Interceptor

flutter - 如何解决 Dart SDK 二进制文件冲突

flutter - 摆脱 Flutter 中的黄黑线

flutter - 如何解决 "RangeError (index): Invalid value: Only valid value is 0: 1"错误

dart - 如何列出/删除全局安装的Dart依赖项?

flutter - 如何更改 flutter 中的文本选择选项?

android - 登录错误 : there is an error in logging you into this application. 请稍后在 android 模块的 flutter 中重试

api - Flutter:Futurebuilder从类中获取空值

sql - 在 for 循环中等待 Future

Flutter:如何在我的应用程序中显示印地文字符?