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

如何在Flutter+sqflite中随机选取符合条件的客户数据?

实现方案

核心步骤

  • 先筛选出price大于1000的客户列表,避免每次操作重复计算
  • 用Random类实现随机选取逻辑,同时处理筛选后列表为空的边界情况
  • 给OutlinedButton绑定随机选取方法,完成交互

完整代码示例

假设你的客户数据模型为Client,以下是集成后的完整逻辑:

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

// 你的客户数据模型(根据实际情况调整)
class Client {
  final String numberphone;
  final int price;

  Client({required this.numberphone, required this.price});
}

class ClientListScreen extends StatefulWidget {
  const ClientListScreen({super.key});

  @override
  State<ClientListScreen> createState() => _ClientListScreenState();
}

class _ClientListScreenState extends State<ClientListScreen> {
  List<Client> clientList = []; // 从sqflite查询到的原始列表
  List<Client> filteredClients = []; // 价格>1000的筛选后列表
  Client? selectedClient;
  final Random _random = Random();

  @override
  void initState() {
    super.initState();
    // 替换为你的sqflite数据查询逻辑
    _loadClientsFromDB();
  }

  void _loadClientsFromDB() async {
    // 模拟从数据库获取数据,实际项目中替换为sqflite查询代码
    clientList = [
      Client(numberphone: "13800138000", price: 800),
      Client(numberphone: "13900139000", price: 1200),
      Client(numberphone: "13700137000", price: 1500),
      Client(numberphone: "13600136000", price: 900),
    ];
    // 筛选价格大于1000的客户
    setState(() {
      filteredClients = clientList.where((client) => client.price > 1000).toList();
    });
  }

  void _pickRandomClient() {
    if (filteredClients.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text("没有价格大于1000的客户")),
      );
      return;
    }
    // 生成随机索引并选取客户
    final randomIndex = _random.nextInt(filteredClients.length);
    setState(() {
      selectedClient = filteredClients[randomIndex];
    });
    // 弹窗展示选中的客户信息
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: const Text("随机选中的客户"),
        content: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text("手机号: ${selectedClient!.numberphone}"),
            Text("价格: ${selectedClient!.price}"),
          ],
        ),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(context),
            child: const Text("确定"),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("客户列表")),
      body: Column(
        children: [
          // 随机选取按钮
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: OutlinedButton(
              onPressed: _pickRandomClient,
              child: const Text("随机选取价格>1000的客户"),
            ),
          ),
          // 筛选后的客户列表
          Expanded(
            child: ListView.builder(
              itemCount: filteredClients.length,
              itemBuilder: (BuildContext context, int index) => GestureDetector(
                onTap: () {},
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Container(
                    padding: const EdgeInsets.all(8.0),
                    decoration: BoxDecoration(
                      border: Border.all(color: Colors.grey),
                      borderRadius: BorderRadius.circular(8),
                    ),
                    child: Column(
                      children: <Widget>[
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: <Widget>[
                            Expanded(
                              child: Padding(
                                padding: const EdgeInsets.all(8.0),
                                child: Text(
                                  filteredClients[index].numberphone,
                                  style: Theme.of(context).textTheme.bodyText2,
                                ),
                              ),
                            ),
                          ],
                        ),
                        Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              Expanded(
                                child: Text(
                                  filteredClients[index].price.toString(),
                                  style: Theme.of(context).textTheme.bodyText1,
                                ),
                              )
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

关键说明

  1. 筛选逻辑:用where方法过滤原始列表,只保留price>1000的客户,转成列表后存入filteredClients,建议在数据加载完成后一次性筛选,避免重复计算
  2. 随机选取:通过Random().nextInt(filteredClients.length)获取随机索引,再取出对应客户
  3. 边界处理:判断筛选后列表是否为空,为空时弹出提示,防止索引越界报错
  4. 列表展示:把原代码中的clientList替换为filteredClients,确保只展示符合条件的客户

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:35:21