【问题标题】:Shared Preferences in Flutter cannot save and read ListFlutter 中的 Shared Preferences 无法保存和读取 List
【发布时间】:2019-08-27 22:39:30
【问题描述】:

我使用一些共享首选项来读取和保存列表,但我得到的只是一个错误,如下所示:

    Launching lib/main.dart on iPhone 7 in debug mode...
    Xcode build done.                                            4.1s
    Tried calling: getString("t")
#0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1      ShareUtils.get
package:todolist2019/ShareUtils.dart:22
<asynchronous suspension>
#2      HomeScreenState.getTaskTitle
package:todolist2019/home.dart:38
#3      _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#4      HomeScreenState.getTaskTitle
package:todolist2019/home.dart:35
#5      HomeScreenState.build.<anonymous closure>
package:todolist2019/home.dart:97
#6      SliverChildBuilderDelegate.build 
package:flutter/…/widgets/sliver.dart:398

这是我的 home.dart 代码,我的主屏幕

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import './additem.dart';

import './ShareUtils.dart';
class HomeScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return HomeScreenState();
  }
}

Timer timer;

DateTime now = DateTime.now();
String formattedTime = DateFormat('kk:mm').format(now);
String formattedDate = DateFormat('EEE d MMM').format(now);



class HomeScreenState extends State<HomeScreen> {
  void changeTimeAndSetPref() {
    setState(() {
      DateTime now = DateTime.now();
      formattedTime = DateFormat('kk:mm').format(now);
      formattedDate = DateFormat('EEE d MMM').format(now);


    });
  }

 Future getTaskTitle(index) async {
  shareUtils = new ShareUtils();
  shareUtils.Instance();
  await shareUtils.get("title"[index]);

}

  void initState() {
    super.initState();
    // Add listeners to this class
    timer = Timer.periodic(Duration(seconds: 1), (Timer t) => changeTimeAndSetPref());

  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
    return Scaffold(
      floatingActionButton: FloatingActionButton.extended(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => addItem()),
            );
          },
          icon: Icon(Icons.add),
          label: Text("Add Item"),
        ),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      body: Column(
        children: <Widget>[
          Center(
            //set the correct sizes
            child: Card(
              child: Column(
                children: <Widget>[
                  Text(
                    formattedTime,
                    style: TextStyle(
                      fontSize: 50.0,
                    ),
                  ),
                  Text(
                    formattedDate,
                    style: TextStyle(
                      fontSize: 35.0,
                    ),
                  ),
                  Text(
                    "You have  impending tasks",
                    style: TextStyle(
                      fontSize: 25.0,
                    ),
                  )
                ],
              ),
            ),
          ),
          Expanded(
                child: ListView.builder(
                  itemBuilder: (context, index) {
                    var title = getTaskTitle(index).toString();
                    var detail = taskTitleList[index];
                     EdgeInsets.all(16.0);

                    return ListTile(
                      title: Text(
                        title,
                        style: TextStyle(fontSize: 20.0),
                      ),
                      subtitle: Text(
                        detail,
                        style: TextStyle(fontSize: 15.0),
                      ),
                      onTap: () {
                        final snackBar = SnackBar(
                          content: Text('Item Removed'),
                          duration: Duration(seconds: 1),
                        );
                        setState(() {
                          taskTextList.removeAt(index);
                          taskTitleList.removeAt(index);
                          Scaffold.of(context).showSnackBar(snackBar);
                        });
                      },
                    );
                  },
                  itemCount: taskTextList.length,
                ),
              )


        ],
      ),
    );
  }
}

这是我的 additem.dart 代码

import 'package:flutter/material.dart';
import './home.dart';
import './ShareUtils.dart';
class addItem extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return addItemState();
  }
}

ShareUtils shareUtils;
var TaskTextField;
var TaskDetailField;
var taskTextList = [];
var taskTitleList = [];
var TaskIsImportant = false;


class addItemState extends State<addItem> {

   @override
  Widget build(BuildContext context) {
    // TODO: implement build
  void saveTask (key, value) async {
    await shareUtils.set(key, value);
  }
    return Scaffold(
        floatingActionButton: FloatingActionButton.extended(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => HomeScreen()),
            );
            setState(()async {
              if (TaskIsImportant) {

                taskTextList.add("❗$TaskTextField");
                taskTitleList.add("$TaskDetailField");
                saveTask("title", taskTextList);
              } else {
                taskTextList.add("$TaskTextField");
                taskTitleList.add("$TaskDetailField");
                saveTask("title", taskTextList);
              }
            });
          },
          label: Text("Add Task"),
          icon: Icon(Icons.add),
        ),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
        body: Flex(
          direction: Axis.vertical,
          children: <Widget>[
            Flexible(
              child: Container(
                child: Column(
                  children: <Widget>[
                    Card(
                      child: Column(
                        children: <Widget>[
                          Center(
                            child: Text(
                              "Welcome!",
                              style: TextStyle(fontSize: 50.0),
                            ),
                          ),
                          Center(
                            child: Text(
                              "Enter your task below",
                              style: TextStyle(fontSize: 25.0),
                            ),
                          ),
                        ],
                      ),
                    ),
                    Container(
                      child: TextField(
                        decoration: InputDecoration(
                            hintText: "Enter title of task to be added",
                            hintStyle: TextStyle(fontSize: 20.0)),
                        onChanged: (taskTextField) {
                          setState(() {
                            TaskTextField = taskTextField;
                            print(TaskTextField);
                          });
                        },
                      ),
                      margin: EdgeInsets.all(16.0),
                    ),
                    Container(
                      child: TextField(
                        decoration: InputDecoration(
                            hintText: "Enter detail of task to be added",
                            hintStyle: TextStyle(fontSize: 20.0)),
                        onChanged: (taskDetailField) {
                          setState(() {
                            TaskDetailField = taskDetailField;
                            print(TaskDetailField);
                          });
                        },
                      ),
                      margin: EdgeInsets.all(16.0),
                    ),
                    CheckboxListTile(
                      title: Text(
                        "Important",
                        style: TextStyle(fontSize: 25.0),
                      ),
                      activeColor: Colors.blue,
                      value: TaskIsImportant,
                      onChanged: (val) {
                        setState(() {
                          TaskIsImportant = !TaskIsImportant;
                          print(TaskIsImportant);
                        });
                      },
                    ),
                  ],
                ),
              ),
            )
          ],
        ));
  }

}

我希望有人可以帮助我解决这个错误。我在 Flutter 1.2.1 上运行。提前致谢! PS:我已经实现了 Akio 的代码,但仍然有错误,但较少。我还添加了前 6 行错误消息。

【问题讨论】:

  • 您的代码太大而无法阅读...添加一些日志...可能从开始到 5-6 行。
  • 好的,我已经添加了错误日志(前 6 行)
  • var title = getTaskTitle(index);此行返回一个 Future,然后您将其用作文本的参数,该文本需要字符串`Text(title, style: TextStyle(fontSize:25.0))` 看看 future builder
  • 好的会试试
  • 对了,请问futurebuilder是如何使用的?我是这种语言的新手,以前从未使用过 futurebuilder。

标签: dart flutter


【解决方案1】:

您可以在 pubspec.yaml 中添加“shared_preferences: ^0.4.0”。

包得到。 然后你制作 DartFile(例如:文件名是 ShareUtils

import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';

class ShareUtils {
  static ShareUtils _instance;
  SharedPreferences ShareSave;
  factory ShareUtils() => _instance ?? new ShareUtils._();

  ShareUtils._();

  void Instatce() async{
  ShareSave = await SharedPreferences.getInstance();
}


  Future<bool> set(key, value) async{
   return ShareSave.setString(key, value);

  }

  Future<String> get(key) async{
   return ShareSave.getString(key);
  }
}

还有 main.dart

class MyApp extends StatelessWidget {
static ShareUtils shareUtils;

@override
Widget build(BuildContext context) {
  ThemeData mainTheme = new ThemeData(
    primaryColor : Color.fromRGBO(20, 42, 59, 1),
    buttonColor: Color.fromRGBO(0, 132, 255, 1),
    accentColor: Color.fromRGBO(31, 60, 83, 1)
  );
  shareUtils = new ShareUtils();
  shareUtils.Instatce();
  MaterialApp mainApp = new MaterialApp(
    title: "Your app name",
    theme: mainTheme,
    home: new SplashPage(),
    debugShowCheckedModeBanner: true,
    routes: <String, WidgetBuilder>{
      "HomePage": (BuildContext context) => new HomePage(),
    },
  );
  return mainApp;
}

}

你可以在任何地方使用它

在使用之前,在头部添加 import main.dart

获取:

  Future NextPage() async {
   MyApp.shareUtils.get("token").then((token) {
    print(token);
    if (token == null || token == "") {
      Navigator.of(context).popAndPushNamed("RegisterPage");
    } else {
      Navigator.of(context).popAndPushNamed("HomePage");
    }
  });
  }  

设置:

    void UserInfo(code, token) async{
      await MyApp.shareUtils.set("token", token);
      await MyApp.shareUtils.set("code", code);
      await Navigator.of(context).pushNamed("HomePage");
    }

希望能帮到你。谢谢

在你的情况下 MyApp.shareUtils.set("state", statelist.join("@"))

并获取使用 statelist = token.split("@");

【讨论】:

  • 我用列表尝试了你的方法,但它不起作用(字符串有效)。你知道如何解决它吗?
  • 我的示例代码是正确的。我的想法是您使用错误的方式获取或设置价值。所以请分享您的获取或设置代码
  • 我已将我的代码更新为您的代码,并且它正在部分工作。请在我的原始帖子中查看我的新代码和新错误(较少)
  • 你能解释一下你的项目特点吗?如果您发送项目的目的,我将为您制作代码。 PS:share_preference 最新版本是^0.5.1+2。并检查pub.dartlang.org/packages/shared_preferences#-readme-tab-
  • 我打算制作一个带有添加应用程序按钮的待办事项列表应用程序,以转到添加应用程序屏幕。添加应用程序屏幕包含 2 个文本字段,可让您输入任务的标题和详细信息。它还有一个复选框磁贴,允许您选择任务是否重要。单击完成按钮将返回主页,其中包含带有时间和日期的时钟、即将完成的任务数量以及显示即将完成的任务的列表视图。我想使用共享首选项,以便重新启动后任务不会丢失。感谢您的帮助!
猜你喜欢
  • 2019-02-11
  • 1970-01-01
  • 2019-08-27
  • 2021-03-29
  • 2020-10-07
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多