在flutter中缓存两个List

Posted

技术标签:

【中文标题】在flutter中缓存两个List【英文标题】:Cache two Lists in flutter 【发布时间】:2020-08-16 23:58:30 【问题描述】:

我想缓存从 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 供以后使用。

如果有人可以提供帮助,那就太好了:)

【问题讨论】:

你检查过这个plugin吗? 是的,但我不知道如何在列表中使用它。 :( 【参考方案1】:

您的问题描述我没有得到完整的要求,但您可以使用shared_preferences 库来存储数据列表,如下所示 添加以下行 pubspec.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() 中,就像在本示例中所做的那样。您还可以通过多种方式将数据从一个小部件传递给其他小部件,如果您正在寻找状态管理,那么您可以使用 BLOC 或提供程序。

【讨论】:

以上是关于在flutter中缓存两个List的主要内容,如果未能解决你的问题,请参考以下文章

更改一个 Provider 中的属性会将另一个 Provider 中的属性更改为 List Flutter

如何在设备 Flutter 中保存缓存

如何在 Flutter 中缓存来自 Firebase 的图像?

Flutter 的缓存策略

Flutter——FadeInImage本地缓存图片

在缓存的 Flutter Engine 中导航