Çoğu zaman, uygulamada belirli küçük verileri kalıcı olarak saklamanın gerekli olacağı yerler olacaktır. SharedPreferences paketini kullanmak, bunu yapmanın mükemmel bir yoludur!
Bir mobil uygulama geliştirirken, daha sonra kullanmak üzere bir veriyi kaydetmek isteyebilirsiniz; örneğin, uygulama kapatıldığında kullanıcının verileri kaydetmek ve uygulama daha sonra açıldığında o verileri kullanmak gibi.
Uygulamanızda, login ve panel ekranı olduğunu varsayalım. Login olmuş kullanıcının kayıtlarını tutarak kullanıcı uygulamaya her girişinde kullanıcıyı tekrar login ekranına yönlendirmeden giriş yapmış bir şekilde panel ekranına yönlendirebilirsiniz. Kullanıcı uygulamanın verilerini temizlediğinde kullanıcının tekrar login olması gerekmektedir.
Flutter’da SharedPreferences Nasıl Kullanılır?
#1 Projemizin ana klasöründe bulunan pubspec.yaml dosyasına shared_preferences eklentisini eklemek gerekmektedir.
dependencies: shared_preferences: ^2.0.13 //pub.dev/packages/shared_preferences yeni sürümü çıkmış olabilir.
#2 Projede SharedPreferences kullanmak için paket import edilmelidir.
import 'package:shared_preferences/shared_preferences.dart';
Eklentinin kurulumu bu kadar. Şimdi SharedPreferences ile verilerin nasıl kaydedileceğini, okunacağını ve silineceğini göreceğiz.
Flutter’da SharedPreferences’a verileri kaydetmek için SharedPreferences sınıfından bir nesne declare edilmelidir. Nesneyi başlattıktan sonra verileri kaydetmek için setter metotlarını çağırmamız gerekmektedir. Sharedpreferences kullanarak int , string , double , bool tipinde değerler kaydedilmektedir. Dolayısıyla, bu veri türlerini kaydetmek için her biri için setter metodu bulunmaktadır. Her setter metoduna bir anahtar(key) ve bir değer(value) sağlamalıyız.
- setString()
- setInt()
- setDouble()
- setBool()
İlk olarak, nesneyi declare ederek işlemlere başlıyoruz.
SharedPreferences prefs;
Daha sonra nesneyi initialize ediyoruz. (Başlatıyoruz)
getSharedPreferences () async { prefs = await SharedPreferences.getInstance(); }
Şimdi setter metotlarını çağırmak ve verileri kaydetmek için yukarıdaki nesneyi kullanacağız.
String değeri kaydetmek için setString() metodunu çağırın ve anahtarı ve değeri ayarlayın.
saveStringValue () async
{
prefs = await SharedPreferences.getInstance();
prefs.setString("username", "imonursahin");
}
Yukarıdaki kod, anahtar => username, değer => imonursahin ekleyecektir.
SharedPreferences’ta Int Değerini Kaydetme
Int değeri kaydetmek için setInt() metodunu çağırın ve anahtarı ve değeri ayarlayın.
saveIntValue () async
{
prefs = await SharedPreferences.getInstance();
prefs.setInt("status", 2);
}
Yukarıdaki kod, anahtar => status, değer => 2 ekleyecektir.
Double değeri kaydetmek için setDouble() metodunu çağırın ve anahtarı ve değeri ayarlayın.
saveDoubleValue () async
{
prefs = await SharedPreferences.getInstance();
prefs.setDouble("price", 9.99);
}
Yukarıdaki kod, anahtar => price, değer => 9.99 ekleyecektir.
Bool değeri kaydetmek için setBool() metodunu çağırın ve anahtarı ve değeri ayarlayın.
saveBoolValue () async
{
prefs = await SharedPreferences.getInstance();
prefs.setBool("isVerify", false);
}
Yukarıdaki kod, anahtar => isVerify, değer => false ekleyecektir.
Flutter’da SharedPreferences’tan
Flutter’da SharedPreferencesdan verileri almak veya okumak için, SharedPreferences sınıfının getter (alıcı) metotları kullanılmaktadır. Getter metoduna sadece anahtarı sağlamalıyız. Metot, ilgili anahtarın değerini return eder.
- getSring()
- getInt()
- getDouble()
- getBool()
SharedPreferences veri alırken veya okurken değer olarak null alınabilmektedir. Sağlanan anahtar için değer mevcut değilse veya yanlış bir anahtar sağlanırsa, null değerini return eder ve hata verecektir. Bu sorunu ‘if null ‘ ( ?? ) kullanarak çözülebilmektedir.
prefs = await SharedPreferences.getInstance();
int users = prefs.getInt("count") ?? 0;
prefs.getInt(“count”) boş olmayan bir değer döndürürse, users değişkenine atanır. Değer olarak null döndürürse, users değişkenine ‘ 0 ‘ atanır. Prefs.getInt(“count”), ‘count’ anahtarı için herhangi bir değer bulunmazsa veya anahtarın kendisi yoksa null değerini return eder.
String değeri okumak için getString() metodunu çağırın ve anahtarı ayarlayın.
retrieveStringValue () async
{
prefs = await SharedPreferences.getInstance();
String value = prefs.getString("username");
print(value);
}
Çıktı: imonursahin
Int değeri okumak için getInt() metodunu çağırın ve anahtarı ayarlayın.
retrieveIntValue () async
{
prefs = await SharedPreferences.getInstance();
int value = prefs.getInt("status");
print(value);
}
Çıktı: 2
Double değeri okumak için getDouble() metodunu çağırın ve anahtarı ayarlayın.
retrieveDoubleValue () async
{
prefs = await SharedPreferences.getInstance();
double value = prefs.getDouble("price");
print(value);
}
Çıktı: 9.99
Bool değeri okumak için getBool() metodunu çağırın ve anahtarı ayarlayın.
retrieveBooleanValue () async
{
prefs = await SharedPreferences.getInstance();
bool value = prefs.getBool("isVerify");
print(value);
}
Çıktı: false
Flutter’da SharedPreferences’tan
Flutter’da SharedPreferencesdaki verileri silmek veya kaldırmak için remove() metodu kullanılmaktadır. Kaydı silmek için sadece anahtarı sağlamak gerekmektedir.
deleteValue () async
{
prefs = await SharedPreferences.getInstance();
prefs.remove("username");
}
SharedPreferences de bir anahtarın veya verinin var olup olmadığını kontrol etmek için includeKey() metodu kullanılmaktadır. Bu metot, anahtarı değer olarak alır ve anahtarın SharedPreferences’de var olup olmadığını kontrol eder. Anahtar varsa, true değerini, aksi takdirde false değerini döndürmektedir.
checkKey () async
{
prefs = await SharedPreferences.getInstance();
bool hasKey = prefs.containsKey("username");
print(hasKey);
}
Çıktı: true
checkKey () async
{
prefs = await SharedPreferences.getInstance();
bool hasKey = prefs.containsKey("email");
print(hasKey);
}
Çıktı: false
Flutter’da SharedPreferencesi kullanacağımız, kullanıcının girdiği değerin kaydetme,okuma ve silme işlemlerini yapacak örnek bir uygulama yapacağız.
Uygulamada, 1 textfield, 1 text ve 3 buton bulunmaktadır.
#1 SharedPreferences paketini yükleyip sayfamıza import edelim.
#2 Uygulamamızın görünümünü ve işlevlerini tanımlayalım.
body: Container(
margin: EdgeInsets.all(20),
child: Column(
children: [
TextField(
controller: userController,
decoration: InputDecoration(
border: OutlineInputBorder(),
),
),
SizedBox(
height: 30,
),
Text(
userName,
style: TextStyle(fontSize: 20),
),
SizedBox(
height: 30,
),
ElevatedButton(
child: Text("Kaydet", style: TextStyle(color: Colors.white)),
onPressed: () {
save();
},
),
ElevatedButton(
child: Text("Oku", style: TextStyle(color: Colors.white)),
onPressed: () {
read();
},
),
ElevatedButton(
child: Text("Sil", style: TextStyle(color: Colors.white)),
onPressed: () {
delete();
},
)
],
)),
Yukarıdaki kodda 1 textfield, 1 text ve 3 buton oluşturduk.
late SharedPreferences prefs;
TextEditingController userController = new TextEditingController();
String userName = "";
Kullanıcından aldığımız değeri kaydetmeyi sağlayan butonun fonksiyonu yazalım.
save() async {
prefs = await SharedPreferences.getInstance();
prefs.setString("username", userController.text.toString());
}
Kullanıcından aldığımız değeri silmeyi sağlayan butonun fonksiyonu yazalım.
delete() async {
prefs = await SharedPreferences.getInstance();
prefs.remove("username");
userName = "";
setState(() {});
}
Kullanıcından aldığımız değeri okumayı sağlayan butonun fonksiyonu yazalım.
read() async {
prefs = await SharedPreferences.getInstance();
userName = prefs.getString("username") ?? "Değer Yok";
setState(() {});
}
Yukarıda veri okuma bölümünde bahsettiğimiz null bir değeri döndürdüğümüzde bize hata vereceğini söylemiştik. Kodda ilgili alana ?? “Değer Yok” yazarak, boş bir değer döndürüldüğünde ekranda Değer Yok yazısı yazdırılacaktır.
Tam Kod
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SharedPreferences',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.orange,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
late SharedPreferences prefs;
TextEditingController userController = new TextEditingController();
String userName = "";
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text("SharedPreferences", style: TextStyle(color: Colors.white)),
),
body: Container(
margin: EdgeInsets.all(20),
child: Column(
children: [
TextField(
controller: userController,
decoration: InputDecoration(
border: OutlineInputBorder(),
),
),
SizedBox(
height: 30,
),
Text(
userName,
style: TextStyle(fontSize: 20),
),
SizedBox(
height: 30,
),
ElevatedButton(
child: Text("Kaydet", style: TextStyle(color: Colors.white)),
onPressed: () {
save();
},
),
ElevatedButton(
child: Text("Oku", style: TextStyle(color: Colors.white)),
onPressed: () {
read();
},
),
ElevatedButton(
child: Text("Sil", style: TextStyle(color: Colors.white)),
onPressed: () {
delete();
},
)
],
)),
);
}
save() async {
prefs = await SharedPreferences.getInstance();
prefs.setString("username", userController.text.toString());
}
read() async {
prefs = await SharedPreferences.getInstance();
userName = prefs.getString("username") ?? "Değer Yok";
setState(() {});
}
delete() async {
prefs = await SharedPreferences.getInstance();
prefs.remove("username");
userName = "";
setState(() {});
}
}
Kod Çıktısı (video)