- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个类(class)列表。用户使用 ListTile 上的复选框将每门类(class)标记为已完成。我实现了共享首选项,因此当用户关闭应用程序时,已完成类(class)的列表仍然存在。这些值正在保存,但是当应用程序关闭(在模拟器中或通过 IDE)并重新打开时,UI 将值显示为 false(即使终端显示该值为 True)。当我热重启时,UI 将值显示为 True(从一开始就是预期的)。我无法使用模拟器按钮或在设备上正确显示 UI。
如何让 UI 立即正确显示值?
SharedPreferences prefs;
void getResult(Course course) async {
prefs = await SharedPreferences.getInstance();
results[course.courseResult] = prefs.getBool(course.courseResult) ?? false;
print('${course.courseTitle} Result: ${results[course.courseResult]}');
setState(() {
results[course.courseResult];
});
}
Future<bool> setResult(Course course) async {
prefs = await SharedPreferences.getInstance();
print ('${course.courseTitle} SET TO ${results[course.courseResult]}');
return prefs.setBool(course.courseResult, results[course.courseResult]);
}
initState() {
super.initState();
getResult(widget.entry);
}
Future onChanged(bool value, Course course) {
setState(() {
results[course.courseResult] = value;
});
return setResult(course);
}
这是完整的代码(虽然出于空间原因我确实缩短了列表,并省略了不受此错误影响的页面...)
import 'package:flutter/material.dart';
import 'main.dart';
import 'CourseList.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';
import 'package:url_launcher/url_launcher.dart';
import 'package:intl/intl.dart';
class LearningPlan extends StatefulWidget{
LearningPlanState createState() => new LearningPlanState();
}
class LearningPlanState extends State<LearningPlan> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(
title: Text('Learning Plan'),
),
drawer: MyDrawer(),
body: ListView.builder(
itemBuilder: (BuildContext context, int index) =>
new CourseTile(courseList[index]),
itemCount: courseList.length,
),
);
}
}
class CourseTile extends StatefulWidget {
CourseTile(this.entry);
final Course entry;
CourseTileState createState() => new CourseTileState();
}
class CourseTileState extends State<CourseTile> {
//Detail Card
Future<Null> _launched; // ignore: unused_field
Future<Null> _launchInWebViewOrVC(String url) async {
if (await canLaunch(url)) {
await launch(url, forceSafariVC: false, forceWebView: false);
} else {
throw 'Could not launch $url';
}
}
Widget selfDirectedURL(Course course) {
if (course.courseMethod == 'Self-Directed') {
return new IconButton(
icon: Icon(Icons.cloud_download),
onPressed: () => setState(() {
_launched = _launchInWebViewOrVC(course.courseURL);
}),
);
} else {
return new Container();
}
}
Future<Null> courseDetails(Course course) async {
await showDialog(
context: context,
child: new SimpleDialog(
title: Text(course.courseTitle),
children: <Widget>[
Stack(
children: <Widget>[
Center(child: Image.asset(course.courseImage,
colorBlendMode: BlendMode.lighten,
color: fkBlue25,
height: 200.0,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(course.courseDescription),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
selfDirectedURL(course),
FlatButton(
onPressed: (){
Navigator.pop(context);
},
child: Text('OK'),
),
],
),
],
));
}
//CheckBox Constructors
SharedPreferences prefs;
void getResult(Course course) async {
prefs = await SharedPreferences.getInstance();
results[course.courseResult] = prefs.getBool(course.courseResult) ?? false;
print('${course.courseTitle} Result: ${results[course.courseResult]}');
setState(() {
results[course.courseResult];
});
}
Future<bool> setResult(Course course) async {
prefs = await SharedPreferences.getInstance();
print ('${course.courseTitle} SET TO ${results[course.courseResult]}');
return prefs.setBool(course.courseResult, results[course.courseResult]);
}
initState() {
super.initState();
getResult(widget.entry);
}
Future onChanged(bool value, Course course) async {
final result = await setResult(course);
setState(() {
results[course.courseResult] = value;
});
return result;
}
//Main Tile
Widget buildTiles(Course course) {
return Card(
shape: Border.all(
color: fkBlue,
),
margin: EdgeInsets.all(16.0),
elevation: 8.0,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: ListTile(
title: Text(course.courseTitle),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(course.courseCode),
Text(course.courseMethod)
],
),
leading: SizedBox(
height: 60.0,
width: 60.0,
child: Image.asset(course.courseImage)),
trailing: Column(
children: <Widget>[
Text(results[course.courseResult] ? 'Complete' : 'Incomplete',
),
Checkbox(
value: results[course.courseResult],
onChanged: (bool value) {
onChanged(value, course);
if (value == true) {
snackBarCompleted(course);
} else {
snackBarUnCompleted(course);
}
},
),
]
),
onTap: () {
courseDetails(course);
}
),),
);
}
@override
Widget build(BuildContext context) {
return buildTiles(widget.entry);
}
void snackBarCompleted(course) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text(
'${course.courseTitle} completed on ${DateFormat.yMd().format(DateTime.now()).toString()}'
),
backgroundColor: fkBlue,
duration: Duration(seconds: 3),
),
);
}
void snackBarUnCompleted(course) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text('${course.courseTitle} no longer marked \"Complete\"'
),
duration: Duration(seconds: 3),
),
);
}
}
//Learning Schedule Page
class LearningSchedule extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(
title: Text('Schedule'),
),
drawer: MyDrawer(),
body: ListView.builder(
itemBuilder: (BuildContext context, int index) =>
new LearningScheduleBuilder(courseList[index]),
itemCount: courseList.length,
),
);
}
}
class LearningScheduleBuilder extends StatelessWidget {
LearningScheduleBuilder(this.entry);
final Course entry;
Widget buildList (Course course) {
return Text(course.courseTitle,
style: new TextStyle(color: results[course.courseResult] ? Colors.grey : fkBlue),);
}
@override
Widget build(BuildContext context) {
return buildList(entry);
}
}
final List<Course> courseList = <Course>[
new Course(
courseTitle: 'Company Orientation',
coursePreReq: 'N/A',
courseCode: 'HR',
courseURL: '',
courseMethod: 'Facilitator-Led',
courseImage: 'assets/courseImage/logo.png',
courseDescription:
'Company overview; Benefits package and documents; Ethics and Compliance Training, Introduction to learning programs; Computer orientation; Lab tour; Safety training.',
courseAudience: 'BCAE BCCC ITAE ITCC TCTAE TCTCC PlasmaCC PlasmaAE',
courseResult: 'result1',
),
new Course(
courseTitle: 'Intro to Learning Program',
coursePreReq: 'N/A',
courseCode: 'Nicole Asma',
courseURL: '',
courseMethod: 'Facilitator-Led',
courseImage: 'assets/courseImage/logo.png',
courseDescription:
'Overview of onboarding program; Components of North America University; Support available for all learning units; introduction to Learning and Development Team Overview of WebEx calls.',
courseAudience: 'BCAE BCCC ITAE ITCC TCTAE TCTCC PlasmaCC PlasmaAE',
courseResult: 'result2',
),
class Course {
final String courseTitle;
final String coursePreReq;
final String courseCode;
final String courseDescription;
final String courseImage;
final String courseMethod;
final String courseURL;
final String courseAudience;
final String courseResult;
const Course({
this.courseTitle,
this.coursePreReq,
this.courseCode,
this.courseDescription,
this.courseImage,
this.courseMethod,
this.courseURL,
this.courseAudience,
this.courseResult,
});
Course.fromMap(Map<String, dynamic> map)
: courseTitle = map['courseTitle'],
coursePreReq = map['coursePreReq'],
courseCode = map['courseCode'],
courseDescription = map['courseDescription'],
courseImage = map['roocourseImagem'],
courseMethod = map['courseMethod'],
courseURL = map['courseURL'],
courseAudience = map['courseAudience'],
courseResult = map['courseResult'];
}
Map results = {
'result1': false,
'result2': false,
'result3': false,
'result4': false,
最佳答案
你能做这个小小的改变吗? :
改变这个:
Future onChanged(bool value, Course course) {
setState(() {
results[course.courseResult] = value;
});
return setResult(course);
}
对此:
Future onChanged(bool value, Course course) async {
final result = await setResult(course);
setState(() {
results[course.courseResult] = value;
});
return result;
}
更新
将您的 initState
方法替换为:
_onLayoutDone(_){
getResult(widget.entry);
}
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback(_onLayoutDone);
super.initState();
}
关于sharedpreferences - Flutter Shared Preferences 保存值,不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52208209/
为了使用androidx.preference,我应该将依赖添加到build.gradle 图片 A 来自 https://developer.android.com/jetpack/androidx
我正在尝试从我的应用程序设置 (preferences.xml) 的布局中检索 SeekBarPreference。但是,当我尝试将 findPreference("font_size") 转换为 S
我的需求 拥有一个充满偏好的主屏幕 (main_screen) 单击此 main_screen 中的一个首选项(pref1)会打开一个 设置子屏幕(sub_screen) 在这个 sub_screen
我正在使用 Eclipse 3.7 (Indigo) 作为 Eclipse 插件。该插件将通过产品文件打包为独立应用程序。安装将是多用户安装,如 this link 的场景 2 中所述。 。这样就会有
Preferences.flush() 和 Preferences.sync() 有什么区别? 来自Javadoc(flush()): Forces any changes in the conten
在我的 AppDelegate.m 中,如果用户还没有进入设置面板,我会尝试从我的 Preference Bundle 中初始化默认值。初始化运行,我看到了符合我偏好的正确数量的对象,但它们都是空的,
我有 CheckBoxPreference 和其他 2 个:一个是 Edit Test Pref。另一个是 ListBox Pref。我如何启用列表框首选项和禁用编辑文本首选项。 CheckBoxPr
我想使用“prefer source”选项安装所有由我维护的依赖项,以及使用“prefer dist”选项安装所有其他非我维护的依赖项。 Composer 可以吗?我在想可能有这样的东西,但我找不到:
查看PHP Composer的install命令的帮助,看到以下两个选项 $ composer help install Options: --prefer-source Fo
我无法解决错误的问题: incompatible types: no unique maximal instance exists for type variable T with upper bou
我的任务是使用 POSIX 线程编写读写实现。我想知道我的实现对于这两种情况是否正确: 已删除可怕的尝试 2 号尝试 读者首选: 变量: int readersActive_; sem_t lock_
我正在尝试使用上面的工具栏为我的应用创建一个设置窗口,以输入“后退”按钮等。但是我总是这个错误。 错误 呈现期间引发的异常:android.support.design.widget.AppBarLa
Coverity 实例详细信息: SA 版本:8.6连接:8.7 尝试将缺陷上传到 coverity 实例时,出现以下错误 正在连接到服务器 xxx.xxx.com:9090[错误] SSL 请求失败
在我当前的应用程序中,我已将偏好设置的导入从“android.preference.Preference”更改为“android.support.v7.preference.Preference”,因
在学习旧教程 (Créez des applications pour Android -> openclassroom) 时,我被 PreferenceActivity 类中的这个已弃用的方法 ad
我想在我的应用程序中使用“API Demos/app/preferences/1.preferences from XML”布局,但我不知道在哪里可以找到源文件。我在 API 演示示例中进行了搜索,但
我必须使用 weblogic.xml 在 Weblogic 12c 服务器 (12.2.1) 上 它是基于 Jersey 1.9 的 REST 应用程序。 (Jersey 1.x JAX-RS RI)
我有一些简单的代码,我正在使用它来学习使用路标库的 OAuth 身份验证。我正在尝试使用 java.util.prefs.Preferences 将请求 token 、 token secret 和
如果没有特殊要求,我们可以使用android提供的框架来创建系统样式的preference screen,在其内部可以包含preferencecategory和preference<con
我需要基于另一个应用构建一个应用。在我的 PreferenceScreen 中,我有 2 个 ListPreference 对象。第二个依赖于第一个并禁用,直到选择第一个(仍然需要弄清楚) 我想将第一
我是一名优秀的程序员,十分优秀!