Привет, ребята, это мой первый урок. Я надеюсь, что могу рассказать вам ясно, так что наслаждайтесь!
Как вы знаете, иногда в нашем приложении нам нужно сохранить наши данные в локальное хранилище. Вот почему мы используем общие настройки. В pub.dev общие настройки имеют простой способ их использования. Кроме того, общие настройки набрали 6 тысяч лайков на pub.dev, и это здорово! Проблема в том, что в общих настройках нет никакого метода, позволяющего нам сохранить значение объекта, вот в чем проблема. Если вы перейдете на pub.dev и выполните поиск Shared Preferences в разделе примеров, Shared Preferences просто позволит нам сохранить наши int, string, bool, double и список строковых данных. Итак, в этой статье я поделюсь с вами, как сохранить наш объект с помощью общих настроек. Итак, продолжайте читать.
Я покажу вам, как сохранить значение нашего объекта с помощью общих настроек. В этом случае я буду получать данные из общедоступного API (reqres.in) с помощью http, а затем сохранять в нашем локальном хранилище с помощью общих настроек. Хорошо, давайте кодировать!
Прежде чем мы начнем, попробуем сохранить наш объект в локальном хранилище. Есть важная вещь, которую вы должны знать. Да, нам нужно установить пакет или плагин, который мы можем использовать в этом случае. Итак, я установил два пакета: первый — Shared Prefrences, а второй — http. Позвольте мне рассказать вам немного о двух пакетах выше. Общие настройки, которые мы можем использовать для сохранения наших данных в локальном хранилище, как указано в заголовке этой статьи выше. И Http я буду использовать для получения данных из Интернета. Довольно просто, правда?
Давайте кодировать!
import 'package:flutter/material.dart'; class HomePageScreen extends StatelessWidget { const HomePageScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.black, title: const Text( 'Home Screen', ), titleTextStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w700, color: Colors.white, ), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: const [ Text( 'Id is ', style: TextStyle( fontSize: 24, fontWeight: FontWeight.w700, ), ), SizedBox( height: 40, ), Text( 'Email is ', style: TextStyle( fontSize: 24, fontWeight: FontWeight.w700, ), ), ], ), ), ); } }
Выше у меня есть простой домашний экран, который я могу использовать для отображения данных позже. Следующий шаг, давайте создадим модель для анализа наших данных из reqres.in в наш объект.
// To parse this JSON data, do // // final userModel = userModelFromJson(jsonString); import 'dart:convert'; UserModel userModelFromJson(String str) => UserModel.fromJson(json.decode(str)); String userModelToJson(UserModel data) => json.encode(data.toJson()); class UserModel { UserModel({ this.data, this.support, }); Data? data; Support? support; factory UserModel.fromJson(Map<String, dynamic> json) => UserModel( data: Data.fromJson(json["data"]), support: Support.fromJson(json["support"]), ); Map<String, dynamic> toJson() => { "data": data!.toJson(), "support": support!.toJson(), }; } class Data { Data({ this.id, this.email, this.firstName, this.lastName, this.avatar, }); int? id; String? email; String? firstName; String? lastName; String? avatar; factory Data.fromJson(Map<String, dynamic> json) => Data( id: json["id"], email: json["email"], firstName: json["first_name"], lastName: json["last_name"], avatar: json["avatar"], ); Map<String, dynamic> toJson() => { "id": id, "email": email, "first_name": firstName, "last_name": lastName, "avatar": avatar, }; } class Support { Support({ this.url, this.text, }); String? url; String? text; factory Support.fromJson(Map<String, dynamic> json) => Support( url: json["url"], text: json["text"], ); Map<String, dynamic> toJson() => { "url": url, "text": text, }; }Our model is already, i use app.quicktype.io to generate our data from response, to our object that we can use later.
Во-первых, я буду получать данные из Интернета, используя http. Вы можете следовать моему коду ниже:
import 'dart:convert'; import 'dart:developer'; import 'package:example/model/user_model.dart'; import 'package:http/http.dart' as http; class HomeScreenController { Future<UserModel> fetchUser() async { final url = Uri.parse('https://reqres.in/api/users/2'); http.Response response = await http.get(url); UserModel userResponse = UserModel.fromJson(jsonDecode(response.body)); log( 'RESPONSE: EMAIL IS ${userResponse.data!.email}\nFIRST NAME ${userResponse.data!.firstName}\nLAST NAME ${userResponse.data!.lastName}', ); return userResponse; } }
Выше у меня есть простой способ получить данные из Интернета. Сначала вы можете создать папку с именем controller, а затем создать файл внутри папки с именем HomeScreenController. На главном экране мы немного изменим, чтобы отобразить данные.
import 'package:example/controller/home_screen_controller.dart'; import 'package:example/model/user_model.dart'; import 'package:flutter/material.dart'; class HomePageScreen extends StatelessWidget { HomePageScreen({super.key}); final HomeScreenController controller = HomeScreenController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.black, title: const Text( 'Home Screen', ), titleTextStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w700, color: Colors.white, ), ), body: FutureBuilder<UserModel>( future: controller.fetchUser(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center( child: CircularProgressIndicator(), ); } if (snapshot.hasData) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Id is ${snapshot.data!.data!.id!}', style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w700, ), ), const SizedBox( height: 40, ), Text( 'Email is ${snapshot.data!.data!.email!}', style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w700, ), ), ], ), ); } return const Center( child: Text('Oopps.... Something Wrong'), ); }), ); } }
Как видите, я использую FutureBuilder для отображения данных из HomeController. Итак, результат будет примерно таким:
Но мы еще не сохраняем наши данные в локальном хранилище. Как мы сохраняем в наше локальное хранилище? Это достаточно просто.
import 'dart:convert'; import 'dart:developer'; import 'package:example/model/user_model.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; class HomeScreenController { Future<UserModel> fetchUser() async { try { SharedPreferences prefs = await SharedPreferences.getInstance(); final url = Uri.parse('https://reqres.in/api/users/2'); http.Response response = await http.get(url); UserModel userResponse = UserModel.fromJson(jsonDecode(response.body)); // SAVE TO OUR LOCAL STORAGE Map<String, dynamic> dataUser = jsonDecode(userModelToJson(userResponse)); final userEncode = jsonEncode(dataUser); /* CODE ABOVE WILL RETURN STRING SO, WE CAN USE OUR SHARED PREFERENCES TO SAVE OUR OBJECT */ prefs.setString('user', userEncode); // LET'S SEE OUR DATA THAT WE SAVE TO LOCAL STORAGE String getPrefs = prefs.getString('user')!; log('SAVE TO LOCAL $getPrefs'); return userResponse; } catch (e) { log(e.toString()); throw e.toString(); } } }
Как видите, я изменил свой HomeScreenController. Сначала вы можете следовать моему коду. Тогда я постараюсь объяснить вам это. Сначала мы получаем данные из Интернета и вставляем их в нашу модель, используя метод from json. Мы не можем использовать userResponse напрямую к нашему значению Shared Preferences, потому что его тип не совпадает. Итак, мы можем использовать jsonDecode и метод json для преобразования нашей модели. jsonResponse вернет Map‹String, dynamic›. Затем мы можем закодировать наш объект (jsonResponse). Зачем нам нужно кодировать наш объект? Как я объясню сначала, общие настройки не имеют никакого метода, позволяющего нам сохранять наши данные в локальном хранилище. Вот почему нам нужно преобразовать наш объект в строку, используя метод кодирования. Итак, наш объект уже является строкой, мы можем использовать Shared Preferences для сохранения в локальном хранилище. Достаточно просто, не так ли?
Надеюсь, вы понимаете, о чем я говорю выше. Таким образом, вы можете уменьшить свой запрос к серверу, если ваши данные уже есть. Надеюсь, я рассказал вам ясно, спасибо за чтение моего первого урока. Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте ниже. Хорошего дня! Удачного кодирования!