【问题标题】:Flutter/Dart - The method 'setStringList' was called on nullFlutter/Dart - 在 null 上调用了方法“setStringList”
【发布时间】:2021-03-12 12:07:11
【问题描述】:

我是编程新手。我尝试了一些简单的事情,但我有一个错误,我无法进一步了解。所以这是我得到的 NoSuchMethodError:

在 null 上调用了方法“setStringList”。 接收方:空 尝试调用:setStringList("title", Instance(length:1) of '_GrowableList')

我现在将向您展示我认为错误所在的代码:

import 'dart:collection';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'package:pro_todo/models/task.dart';

class TodosModel extends ChangeNotifier {
  List<Task> _tasks = [];
  SharedPreferences sharedPreferences;

  saveSharedPreferences() async {
    sharedPreferences = await SharedPreferences.getInstance();
    loadData();
  }

  UnmodifiableListView<Task> get allTasks => UnmodifiableListView(_tasks);
  UnmodifiableListView<Task> get incompleteTasks =>
      UnmodifiableListView(_tasks.where((task) => !task.completed));
  UnmodifiableListView<Task> get completedTasks =>
      UnmodifiableListView(_tasks.where((task) => task.completed));

  void addTodo(Task task) {
    _tasks.add(task);
    saveData();
    notifyListeners();
  }

  void toggleTodo(Task task) {
    final taskIndex = _tasks.indexOf(task);
    _tasks[taskIndex].toggleCompleted();
    notifyListeners();
  }

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

  void saveData() {
    List<String> spList =
        _tasks.map((task) => json.encode(task.toMap())).toList();
    sharedPreferences.setStringList('title', spList);
    print(spList);
  }

  void loadData() {
    List<String> spList = sharedPreferences.getStringList('task');
    _tasks = spList.map((task) => Task.fromMap(json.decode(task))).toList();
    notifyListeners();
  }
}

在 void saveData => sharedPreferences.setStringList('title', spList) 是错误。如果我将其标记为评论,程序没有给我任何错误,但它也不会保存数据。

我想了解_tasks列表需要看这段代码:

import 'package:flutter/material.dart';

class Task {
  String title;
  bool completed;

  Task({@required this.title, this.completed = false});

  void toggleCompleted() {
    completed = !completed;
  }

  Task.fromMap(Map map)
      : this.title = map['title'],
        this.completed = map['completed'];

  Map toMap() {
    return {
      'title': this.title,
      'completed': this.completed,
    };
  }
}

这是调用addTask方法的方法:

void onAdd() {
    final String textVal = taskTitleController.text;
    final bool completed = completedStatus;
    if (textVal.isNotEmpty) {
      final Task task = Task(
        title: textVal,
        completed: completed,
      );
      Provider.of<TodosModel>(context, listen: false).addTodo(task);
      Navigator.pop(context);
    }
  }

我希望任何人都可以帮助并提前感谢您!

【问题讨论】:

    标签: visual-studio flutter dart sharedpreferences provider


    【解决方案1】:

    当您调用您的方法saveData 时,您的 SharedPreferences 实例未初始化 在设置列表之前,您必须使用sharedPreferences = await SharedPreferences.getInstance(); 对其进行初始化。

      SharedPreferences sharedPreferences;
    
      SharedPreferences  _getSharedPreferences() async {
        if(sharedPreferences == null){
            sharedPreferences = await SharedPreferences.getInstance();
        }
        return sharedPreferences;
      }
    
      void saveData() async {
        List<String> spList =
            _tasks.map((task) => json.encode(task.toMap())).toList();
        _getSharedPreferences().setStringList('title', spList);
        print(spList);
      }
    
      void loadData() {
        List<String> spList = _getSharedPreferences().getStringList('task');
        _tasks = spList.map((task) => Task.fromMap(json.decode(task))).toList();
        notifyListeners();
      }
    

    【讨论】:

    • 谢谢它的帮助!但现在我在 loadData 处收到此错误:方法 'getStringList' 在 null 上被调用。你也知道这个问题的答案吗?非常感谢!
    • 你改变了你的方法saveSharedPreferences
    • 好的,我更新了我的解决方案,以便您以更好的方式处理 SharedPreferences。不要忘记删除您的方法 saveSharedPreferences 并替换为 loadData()
    • 现在它没有保存它了,这个错误来了:类'Future'没有实例方法'setStringList'。 E/flutter (13256): 接收者: 'Future'的实例 E/flutter (13256): 尝试调用: setStringList("title", Instance(length:1) of '_GrowableList')
    • 你可能必须强制输入:SharedPreferences _getSharedPreferences() async {
    猜你喜欢
    • 2021-10-19
    • 2020-01-22
    • 2020-11-06
    • 2019-09-23
    • 2020-06-04
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多