【问题标题】:How to Fix Error when using Provider Package Flutter使用 Provider Package Flutter 时如何修复错误
【发布时间】:2020-10-03 04:42:18
【问题描述】:

我正在创建一个应用程序,例如一个包含您可以添加的活动列表的笔记。我使用提供程序包将更改保存到列表中。该列表由ListView.builder 创建,子级为ListTile,由文本和复选框组成。我的编码没有错误,但在调试中出现错误“如果你想公开一个可以是任何东西的变量,请考虑将动态更改为对象”,就像我给出的图像一样。我该如何解决?

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

提供者类

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

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    您必须使用ConsumerT,而不是仅使用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) {
            // ...
          },
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 2021-04-29
      • 1970-01-01
      • 2022-01-19
      • 2021-02-25
      • 2021-03-09
      • 2020-04-02
      • 2020-02-29
      • 2021-03-25
      相关资源
      最近更新 更多