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

Flutter如何实现选择列表显示值与返回值分离的功能

Flutter选择列表显示值与返回值分离实现方案

需求说明:从接口拉取用户列表,选择列表页面展示用户name,选中后直接返回对应用户的id用于提交到数据库。

完全可以实现,Flutter的选择类组件原生支持值与展示视图分离,不需要额外复杂处理,以下是可直接运行的示例代码:

1. 前置依赖与数据模型定义

首先在pubspec.yaml中添加网络请求依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^1.1.0 # 可替换为最新稳定版本

然后定义User数据模型:

class User {
  final int id;
  final String name;
  User({required this.id, required this.name});
  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
    );
  }
}

2. 网络请求方法封装

import 'package:http/http.dart' as http;
import 'dart:convert';

Future<List<User>> fetchUsers() async {
  final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/users'));
  if (response.statusCode == 200) {
    List<dynamic> body = json.decode(response.body);
    return body.map((json) => User.fromJson(json)).toList();
  } else {
    throw Exception('用户数据加载失败');
  }
}

3. 核心选择页面实现

这里使用Flutter原生DropdownButton组件实现,选中直接返回用户id:

import 'package:flutter/material.dart';

class UserSelectorPage extends StatefulWidget {
  const UserSelectorPage({super.key});
  @override
  State<UserSelectorPage> createState() => _UserSelectorPageState();
}

class _UserSelectorPageState extends State<UserSelectorPage> {
  List<User> _userList = [];
  int? _selectedUserId; // 存储选中的用户id,即需要返回的实际值

  @override
  void initState() {
    super.initState();
    _loadUsers();
  }

  Future<void> _loadUsers() async {
    _userList = await fetchUsers();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('用户选择')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text('请选择用户:'),
            const SizedBox(height: 10),
            _userList.isEmpty
                ? const CircularProgressIndicator()
                : DropdownButton<int>(
                    hint: const Text('请选择用户'),
                    value: _selectedUserId,
                    isExpanded: true,
                    items: _userList.map((user) {
                      return DropdownMenuItem<int>(
                        value: user.id, // 实际返回值为用户id
                        child: Text(user.name), // 页面展示值为用户name
                      );
                    }).toList(),
                    onChanged: (value) {
                      setState(() {
                        _selectedUserId = value;
                      });
                      // 此处拿到的value就是选中用户的id,可直接提交到数据库
                      // 示例:选中Leanne Graham时value=1,选中Ervin Howell时value=2
                      debugPrint('选中的用户id:$_selectedUserId');
                    },
                  ),
            const SizedBox(height: 20),
            if (_selectedUserId != null)
              Text('当前选中的用户id:$_selectedUserId'),
          ],
        ),
      ),
    );
  }
}

扩展说明

如果需要使用其他样式的选择组件(比如底部弹出列表选择、带搜索功能的选择框),逻辑完全通用:只需要将需要返回的id作为组件的实际绑定值,展示层单独渲染name字段即可,二者完全独立互不影响。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:04