? Почему не работает код простой "читалки"?
import "package:shared_preferences/shared_preferences.dart";
import "package:flutter/material.dart";
import "dart:async";
import "dart:io";
void main() => runApp(MyApp());
getIntSF() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int numbP = prefs.getInt('numbPage') ?? 0;
return numbP;
}
int numbPage = getIntSF();
class MyApp extends StatelessWidget {
final contr = ScrollController();
final Bloc bloc = Bloc();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Бла Бла',
theme: ThemeData(primarySwatch: Colors.green),
home: Scaffold(
appBar: AppBar(
title: StreamBuilder(
initialData: numbPage,
stream: bloc.press,
builder: (context, snapshot) => Text(
'Бла Бла ${snapshot.data.toString()}',
style: TextStyle(fontSize: 18.0)),
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.exit_to_app),
tooltip: 'Выйти из приложения',
onPressed: () {
addIntToSF();
exit(0);
})
]),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
StreamBuilder(
initialData: book[numbPage],
stream: bloc.txt,
builder: (context, snapshot) {
return Expanded(
child: SingleChildScrollView(
controller: contr,
child: Text('${snapshot.data}',
style: TextStyle(
fontSize: 20.0,
fontStyle: FontStyle.italic))));
})
])),
bottomNavigationBar: BottomAppBar(
shape: CircularNotchedRectangle(),
child: Container(height: 50.0)),
floatingActionButton: Container(
width: 50.0,
height: 50.0,
child: FloatingActionButton(
onPressed: () {
bloc.butPres.add(numbPage);
contr.jumpTo(0.0);
},
tooltip: 'Бла Бла',
child: Icon(Icons.add))),
floatingActionButtonLocation: FloatingActionButtonLocation.endDocked),
);
}
addIntToSF() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt('numbPage', numbPage);
}
}
class Bloc {
Bloc() {
_contrIn.stream.listen((data) {
numbPage++;
_contrOut.add(numbPage);
_contrOutTxt.add(book[numbPage]);
});
}
get butPres => _contrIn;
var _contrIn = StreamController<int>();
var _contrOut = StreamController<int>();
get press => _contrOut.stream;
var _contrOutTxt = StreamController();
get txt => _contrOutTxt.stream;
void dispose() {
_contrIn.close();
_contrOut.close();
_contrOutTxt.close();
}
}
List book = [
"мама",
"папа",
"бабушка",
"дедушка",
"сын",
"дочь",
];
Ожидалось, что код будет читать из шаред преференсес значение переменной, а после выхода из приложения сохранять его туда же. При следующем старте на экране должна отображаться бывшей последней в предыдущей сессии строка, например "мама".
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Вот пример с singleton:
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State {
var savedString = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Shared Preferences'),
),
body: Container(
padding: EdgeInsets.all(20).add(EdgeInsets.only(top: 20)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RaisedButton(
onPressed: (){
StorageUtil.putString("myString", "My stored string in shared preferences");
},
textColor: Colors.white,
color: Colors.red,
padding: const EdgeInsets.all(8.0),
child: new Text(
"Save String",
),
),
Text(savedString, style: TextStyle(color: Colors.black),),
SizedBox(height: 60,),
RaisedButton(
onPressed: (){
setState(() {
savedString = StorageUtil.getString("myString");
});
},
textColor: Colors.white,
color: Colors.red,
padding: const EdgeInsets.all(8.0),
child: new Text(
"Get String",
),
),
],
),
),
);
}
}
class StorageUtil {
static StorageUtil _storageUtil;
static SharedPreferences _preferences;
static Future getInstance() async {
if (_storageUtil == null) {
var secureStorage = StorageUtil._();
await secureStorage._init();
_storageUtil = secureStorage;
}
return _storageUtil;
}
StorageUtil._();
Future _init() async {
_preferences = await SharedPreferences.getInstance();
}
// получаем
static String getString(String key, {String defValue = ''}) {
if (_preferences == null) return defValue;
return _preferences.getString(key) ?? defValue;
}
// записываем
static Future putString(String key, String value) {
if (_preferences == null) return null;
return _preferences.setString(key, value);
}
}