使用提供程序包 Flutter 时如何修复错误

How to Fix Error when using Provider Package Flutter

我正在创建一个类似笔记的应用程序,其中包含您可以添加的活动列表。我使用提供程序包将更改保存到列表中。该列表由 ListView.builder 创建,子项是由文本和复选框组成的 ListTile。我的编码没有错误,但在调试时出现错误 "if you want to expose a variable that can be anything, consider to changing dynamic to object instead" 就像我给的图像一样。我该如何解决?

Main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:todoey_flutter/models/task_data.dart';
import 'screens/tasks_screen.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => TaskData(),
      lazy: false,
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: TasksScreen(),
      ),
    );
  }
}

task_list.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'task_tile.dart';

class TaskList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer(
      builder: (context, taskDataObject, child) {
        return ListView.builder(
          itemBuilder: (context, index) {
            return TaskTile(
              theTask: taskDataObject.tasks[index].name,
              isChecked: taskDataObject.tasks[index].isDone,
              checkboxCallback: (checkboxState) {
                taskDataObject.updateTask(taskDataObject.tasks[index]);
              },
            );
          },
          itemCount: taskDataObject.taskCount,
        );
      },
    );
  }
}

task_tile.dart

import 'package:flutter/material.dart';

class TaskTile extends StatelessWidget {
  TaskTile({
    this.isChecked,
    this.theTask,
    this.checkboxCallback,
    this.onLongPressCallback,
  });

  final bool isChecked;
  final String theTask;
  final Function checkboxCallback;
  final Function onLongPressCallback;

  @override
  Widget build(BuildContext context) {
    return ListTile(
      onLongPress: onLongPressCallback,
      title: Text(
        theTask,
        style: TextStyle(
            decoration: isChecked ? TextDecoration.lineThrough : null),
      ),
      trailing: Checkbox(
        activeColor: Colors.lightBlueAccent,
        value: isChecked,
        onChanged: checkboxCallback,
      ),
    );
  }
}

the Provider class

import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:todoey_flutter/models/task.dart';

class TaskData extends ChangeNotifier {
  List<Task> _tasks = [
    Task(name: 'cook'),
    Task(name: 'reading'),
    Task(name: 'sleding')
  ];

  int get taskCount {
    return _tasks.length;
  }

  UnmodifiableListView<Task> get tasks {
    return UnmodifiableListView(_tasks);
  }

  void addTask (String newTaskTitle) {
    final task = Task(name: newTaskTitle);
    _tasks.add(task);
    notifyListeners();
  }

  void updateTask (Task task){
    task.toggleDone();
    notifyListeners();
  }

  void deleteTask (Task task){
    _tasks.remove(task);
    notifyListeners();
  }
}

The Error Message

您必须使用 T 中的 Consumer,而不仅仅是 Consumer。所以,把 task_list.dart 改成这样:

class TaskList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<TaskData>( // <--- Here, insert <TaskData> after Consumer
      builder: (context, taskDataObject, child) {
        // ...
      },
    );
  }
}