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
相关产品推荐
相关产品推荐

