You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Shared Preferences本地存储多组地址的实现方案

实现方案(以Android平台为例)

一、定义数据模型

先创建对应地址信息的实体类,方便后续JSON序列化/反序列化操作:

public class Address {
    private String name;
    private String phonenumber;
    private String street;
    private String province;

    // Gson序列化需要空构造函数
    public Address() {}

    // 带参构造函数,用于快速创建对象
    public Address(String name, String phonenumber, String street, String province) {
        this.name = name;
        this.phonenumber = phonenumber;
        this.street = street;
        this.province = province;
    }

    // Getter和Setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getPhonenumber() { return phonenumber; }
    public void setPhonenumber(String phonenumber) { this.phonenumber = phonenumber; }
    public String getStreet() { return street; }
    public void setStreet(String street) { this.street = street; }
    public String getProvince() { return province; }
    public void setProvince(String province) { this.province = province; }
}

二、表单数据存储到Shared Preferences

通过Gson将地址集合转成指定格式的JSON字符串,再存入Shared Preferences:

// 从表单获取输入值
String name = etName.getText().toString().trim();
String phone = etPhone.getText().toString().trim();
String street = etStreet.getText().toString().trim();
String province = etProvince.getText().toString().trim();

// 初始化Shared Preferences
SharedPreferences sp = getSharedPreferences("AddressStorage", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
Gson gson = new Gson();

// 读取已存储的地址数据,无数据则初始化空Map
String existingJson = sp.getString("addresses", "{}");
Map<String, Address> addressMap = gson.fromJson(existingJson, new TypeToken<Map<String, Address>>(){}.getType());

// 生成新的地址key(如address1、address2...)
int nextIndex = addressMap.size() + 1;
String newKey = "address" + nextIndex;

// 添加新地址到Map
addressMap.put(newKey, new Address(name, phone, street, province));

// 将更新后的Map转成JSON字符串并存储
String updatedJson = gson.toJson(addressMap);
editor.putString("addresses", updatedJson);
editor.apply();

三、读取数据并生成卡片展示

使用RecyclerView展示每个地址的独立卡片,步骤如下:

1. 编写卡片布局(item_address_card.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp"
    android:layout_margin="8dp"
    android:background="@drawable/card_bg"> <!-- 可自定义圆角、阴影背景 -->

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

    <TextView
        android:id="@+id/tv_street"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

    <TextView
        android:id="@+id/tv_province"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

</LinearLayout>

2. 实现RecyclerView适配器

public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.AddressViewHolder> {
    private List<Address> addressList;

    public AddressAdapter(List<Address> addressList) {
        this.addressList = addressList;
    }

    @NonNull
    @Override
    public AddressViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_address_card, parent, false);
        return new AddressViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull AddressViewHolder holder, int position) {
        Address address = addressList.get(position);
        holder.tvName.setText("姓名:" + address.getName());
        holder.tvPhone.setText("电话:" + address.getPhonenumber());
        holder.tvStreet.setText("街道:" + address.getStreet());
        holder.tvProvince.setText("省份:" + address.getProvince());
    }

    @Override
    public int getItemCount() {
        return addressList.size();
    }

    public static class AddressViewHolder extends RecyclerView.ViewHolder {
        TextView tvName, tvPhone, tvStreet, tvProvince;

        public AddressViewHolder(@NonNull View itemView) {
            super(itemView);
            tvName = itemView.findViewById(R.id.tv_name);
            tvPhone = itemView.findViewById(R.id.tv_phone);
            tvStreet = itemView.findViewById(R.id.tv_street);
            tvProvince = itemView.findViewById(R.id.tv_province);
        }
    }
}

3. 读取数据并绑定到RecyclerView

// 从Shared Preferences读取地址JSON
SharedPreferences sp = getSharedPreferences("AddressStorage", MODE_PRIVATE);
String json = sp.getString("addresses", "{}");
Gson gson = new Gson();
Map<String, Address> addressMap = gson.fromJson(json, new TypeToken<Map<String, Address>>(){}.getType());

// 将Map转成List,适配RecyclerView
List<Address> addressList = new ArrayList<>(addressMap.values());

// 初始化RecyclerView
RecyclerView rvAddresses = findViewById(R.id.rv_addresses);
rvAddresses.setLayoutManager(new LinearLayoutManager(this));
AddressAdapter adapter = new AddressAdapter(addressList);
rvAddresses.setAdapter(adapter);

四、注意事项

  • 需在Module的build.gradle中添加Gson依赖:
    implementation 'com.google.code.gson:gson:2.10.1'
    
  • 表单提交前建议做非空校验,避免存入无效数据
  • Shared Preferences仅适合存储小量数据,若地址数量较多,建议替换为Room数据库

内容的提问来源于stack exchange,提问作者Afthal Ad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:25:31