栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

颤振-页面之间的持久状态

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

颤振-页面之间的持久状态

您提供的代码存在多个问题。

第一个在你的是

MyAppState
,你没有提供
key
给您的
PageStorage
。确实,没有密钥,书面数据就无法保存,我引用:

writeState(BuildContext上下文,动态数据,{对象标识符})→无效的包:flutter

使用指定的标识符或从给定上下文计算出的标识符将给定数据写入此页面存储桶。计算出的标识符基于从上下文到拥有该页面存储桶的PageStorage小部件的路径中找到的PageStorageKeys。

如果未提供显式标识符 且未找到PageStorageKeys,则不会保存数据。

要解决此问题,只需创建一个全局变量

PageStorageKey mykey = newPageStorageKey("testkey");
并将其传递给您的创建过程
PageStorage

 class MyAppState extends State<MyApp> {  final PageStorageBucket _bucket = new PageStorageBucket();  @override  Widget build(context) {    return new MaterialApp(      home: PageStorage(        child: new MyHomePage(),        bucket: _bucket,        key: mykey,      ),    );  }}

然后再次使用相同的键写入数据:

onPressed: () {   setState(() {     PageStorage.of(context).writeState(context, 'Data saved',         identifier: ValueKey(mykey));     updateText();   });

最后,在我看来,更新文本的方法不是最好的方法。您应该创建一个方法(例如,updateText())并在写入数据后调用它。

 updateText() {    if (PageStorage.of(context) .readState(context, identifier: ValueKey(mykey)) != null) {      _text = PageStorage .of(context).readState(context, identifier: ValueKey(mykey));    }     else {      _text = 'PageStorageNull';    }  }

与往常一样,检查该值是否为非null以避免错误是更安全的。这是完整的代码:

void main() => runApp(new MyApp());PageStorageKey mykey = new PageStorageKey("testkey");class MyApp extends StatefulWidget {  @override  MyAppState createState() {    return new MyAppState();  }}class MyAppState extends State<MyApp> {  final PageStorageBucket _bucket = new PageStorageBucket();  @override  Widget build(context) {    return new MaterialApp(      home: PageStorage(        child: new MyHomePage(),        bucket: _bucket,        key: mykey,      ),    );  }}class MyHomePage extends StatefulWidget {  MyHomePage({Key key}) : super(key: key);  @override  _MyHomePageState createState() => new _MyHomePageState();}class _MyHomePageState extends State<MyHomePage> {  @override  Widget build(context) {    return Center(      child: FloatingActionButton(        onPressed: () {          Navigator.push(context,   new MaterialPageRoute(builder: (context) => new NewPage()));        },      ),    );  }}class NewPage extends StatefulWidget {  NewPageState createState() => NewPageState();}class NewPageState extends State<NewPage> {  String _text;  @override  void initState() {    super.initState();  }  updateText() {    if (PageStorage.of(context) .readState(context, identifier: ValueKey(mykey)) != null) {      _text = PageStorage .of(context).readState(context, identifier: ValueKey(mykey));    }     else {      _text = 'PageStorageNull';    }  }  @override  Widget build(context) {    return Center(      child: Column(        children: <Widget>[          Text('The text is $_text'),          FloatingActionButton( onPressed: () {   setState(() {     PageStorage.of(context).writeState(context, 'Data saved',         identifier: ValueKey(mykey));     updateText();   }); },          )        ],      ),    );  }}

使用此代码,按按钮进入第二页。在第二页上,按按钮以使用

writeState()
方法中提供的数据更新文本。

希望这可以帮助您,

问候

编辑

首先要拳头,对这一点的误解表示抱歉。

实际上,您可以通过使用Bucket实现所需的功能。实际上,

PageStorage .of(context).readState(context,identifier: ValueKey(mykey));
可以用:代替:

_bucket.readState(context, identifier: ValueKey(mykey));

所以,你必须做的是让你的

_bucket
变量全局的,那么你需要用你在你所拥有的一切
NewPageState
PageStorage
使用相同的
Key

,并
Bucket
作为第一个
PageStorage
MyAppState

这样一来,您还可以使用存储桶进行读取,并通过导航保留数据。

同样,他是完整的代码:

import 'package:flutter/material.dart';void main() => runApp(new MyApp());PageStorageKey mykey = new PageStorageKey("testkey");final PageStorageBucket _bucket = new PageStorageBucket();class MyApp extends StatefulWidget {  @override  MyAppState createState() {    return new MyAppState();  }}class MyAppState extends State<MyApp> {  @override  Widget build(context) {    return new MaterialApp(      home: PageStorage(        child: new MyHomePage(),        bucket: _bucket,        key: mykey,      ),    );  }}class MyHomePage extends StatefulWidget {  MyHomePage({Key key}) : super(key: key);  @override  _MyHomePageState createState() => new _MyHomePageState();}class _MyHomePageState extends State<MyHomePage> {  @override  Widget build(context) {    return Center(      child: FloatingActionButton(        onPressed: () {          Navigator.push(context,   new MaterialPageRoute(builder: (context) => new NewPage()));        },      ),    );  }}class NewPage extends StatefulWidget {  NewPageState createState() => NewPageState();}class NewPageState extends State<NewPage> {  String _text;  @override  void initState() {    super.initState();    updateText();  }  updateText() {    if (_bucket.readState(context, identifier: ValueKey(mykey)) != null) {      _text = _bucket.readState(context, identifier: ValueKey(mykey));    }     else {       print(_bucket.toString());    }  }  @override  Widget build(context) {    return PageStorage(      key:mykey,      bucket: _bucket,      child: Column(        children: <Widget>[          Text('The text is $_text'),          FloatingActionButton( onPressed: () {   setState(() {     _bucket.writeState(context, 'Data saved',         identifier: ValueKey(mykey));     updateText();   }); },          )        ],      ),    );  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/406932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号