Кэширование двух списков во флаттере - PullRequest
1 голос
/ 02 мая 2020

Я хочу кэшировать два списка, полученные из Firebase, чтобы использовать их позже, когда пользователь находится в автономном режиме

Это полный код для экрана отображения моего списка -

import 'package:flutter/material.dart';

import 'package:naamaa/calculations/name-list-calc.dart';

List namesList = List();
List meaningsList = List();

class NameList extends StatefulWidget {
  @override
  _NameListState createState() => _NameListState();
}

class _NameListState extends State<NameList> {
  Future<String> getPosts() async {
    var names = await NameListCalc().nameListCalc();
    namesList.addAll(names[0]);
    meaningsList.addAll(names[1]);
    String s = 'test';
    return s;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String>(
      future: getPosts(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Scaffold(
            resizeToAvoidBottomPadding: false,
            body: ListView.builder(
              padding: EdgeInsets.zero,
              itemBuilder: (context, position) {
                return Row(
                  children: <Widget>[
                    Container(
                      width: 100,
                      child: Text(namesList[position]),
                    ),
                    Container(
                      child: Text(meaningsList[position]),
                    )
                  ],
                );
              },
              itemCount: namesList.length,
            ),
          );
        } else {
          return Text(':(');
        }
      },
    );
  }
}

Я хочу кэшировать namesList и MeaningsList для дальнейшего использования.

Если кто-то может помочь, было бы здорово:)

1 Ответ

1 голос
/ 02 мая 2020

Я не получил полное требование по вашему описанию вопроса, но вы можете использовать библиотеку shared_preferences для хранения списка данных следующим образом Добавьте следующую строку pubspe c .yaml

dependencies:
  flutter:
    sdk: flutter
  shared_preferences:

Вы можете использовать этот пример и добавить дополнительные служебные методы в соответствии с вашими требованиями.

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() async {
  AppConfig.init(() {
    runApp(MyApp());
  });
}

class CustomModel {
  int id;
  String name;

  CustomModel({this.id, this.name});

  factory CustomModel.fromJson(Map<String, dynamic> json) {
    return CustomModel(id: json["id"], name: json["name"]);
  }

  Map<String, dynamic> toJson() => {"id": id, "name": name};

  @override
  String toString() {
    return "id: $id, name: $name";
  }
}

class AppConfig {
  static Future init(VoidCallback callback) async {
    WidgetsFlutterBinding.ensureInitialized();
    await SharedPreferenceUtils.init();
    callback();
  }
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class SharedPreferenceUtils {
  static SharedPreferences prefs;

  static init() async {
    prefs = await SharedPreferences.getInstance();
    // storing lists
    await putStringList("m_list", ["abc", "def"]);
    await putObjectList("data",
        [CustomModel(id: 1, name: "Bob"), CustomModel(id: 2, name: "Alice")]);
  }

  static Future<bool> putStringList(String key, List<String> list) async {
    return prefs.setStringList(key, list);
  }

  static List<String> getStringList(String key) {
    return prefs.getStringList(key);
  }

  static Future<bool> putObjectList(String key, List<Object> list) async {
    if (prefs == null) return null;
    List<String> _dataList = list?.map((value) {
      return json.encode(value);
    })?.toList();
    return prefs.setStringList(key, _dataList);
  }

  static List<T> getObjList<T>(String key, T f(Map v),
      {List<T> defValue = const []}) {
    if (prefs == null) return null;
    List<Map> dataList = getObjectList(key);
    List<T> list = dataList?.map((value) {
      return f(value);
    })?.toList();
    return list ?? defValue;
  }

  static List<Map> getObjectList(String key) {
    if (prefs == null) return null;
    List<String> dataList = prefs.getStringList(key);
    return dataList?.map((value) {
      Map _dataMap = json.decode(value);
      return _dataMap;
    })?.toList();
  }
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text(SharedPreferenceUtils.getStringList("m_list").toString()),
              Text(SharedPreferenceUtils.getObjList<CustomModel>(
                  "data", (v) => CustomModel.fromJson(v)).toString()),
            ],
          ),
        ),
      ),
    );
  }
}

Вам не нужно хранить списки в init(), как это сделано для этого примера. Вы также можете передавать данные из одного виджета в другие несколькими способами, и если вы ищете управление состоянием, вы можете использовать BLO C или поставщиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...