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

Flutter中如何运行Future<void>代码并将结果展示在组件中?

解决Flutter中展示Windows磁盘驱动器的问题

首先明确:你的代码依赖dart:io的Process类,仅能在Flutter Windows桌面项目中运行,iOS/Android移动端无法执行wmic命令。

代码改造与Widget选择

需要把代码整合到Flutter的Widget体系中,用StatefulWidget处理异步数据的获取与状态更新,常用的展示组件有以下两种:

1. 用ListView逐个展示驱动器(推荐)

适合清晰列出每个磁盘盘符,示例代码:

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Windows磁盘驱动器')),
        body: const DriveList(),
      ),
    );
  }
}

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

  @override
  State<DriveList> createState() => _DriveListState();
}

class _DriveListState extends State<DriveList> {
  Iterable<String>? _drives;
  String? _error;

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

  Future<void> _loadDrives() async {
    try {
      final drives = await getDrivesOnWindows();
      setState(() => _drives = drives);
    } catch (e) {
      setState(() => _error = '获取驱动器失败: $e');
    }
  }

  Future<Iterable<String>> getDrivesOnWindows() async => LineSplitter.split(
        (await Process.run('wmic', ['logicaldisk', 'get', 'caption'],
                stdoutEncoding: const SystemEncoding()))
            .stdout as String)
      .map((string) => string.trim())
      .where((string) => string.isNotEmpty)
      .skip(1);

  @override
  Widget build(BuildContext context) {
    if (_error != null) {
      return Center(child: Text(_error!));
    }
    if (_drives == null) {
      return const Center(child: CircularProgressIndicator());
    }
    return ListView.builder(
      itemCount: _drives!.length,
      itemBuilder: (context, index) {
        final drive = _drives!.elementAt(index);
        return ListTile(
          title: Text(drive),
          leading: const Icon(Icons.storage),
        );
      },
    );
  }
}

2. 用Text或TextField展示所有结果

如果想把所有盘符拼接成文本展示,可替换上述代码中build方法的内容:

@override
Widget build(BuildContext context) {
  if (_error != null) {
    return Center(child: Text(_error!));
  }
  if (_drives == null) {
    return const Center(child: CircularProgressIndicator());
  }
  final driveText = _drives!.join(', ');
  return Padding(
    padding: const EdgeInsets.all(16.0),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        const Text('磁盘驱动器列表:', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
        const SizedBox(height: 8),
        // 普通文本展示
        Text(driveText),
        const SizedBox(height: 16),
        // 可复制的文本框展示
        TextField(
          controller: TextEditingController(text: driveText),
          maxLines: null,
          readOnly: true,
          decoration: const InputDecoration(
            border: OutlineInputBorder(),
            labelText: '可复制的驱动器列表'
          ),
        ),
      ],
    ),
  );
}

注意事项

  • 确保你的Flutter项目已启用Windows桌面支持(执行flutter config --enable-windows-desktop,重新生成Windows项目文件)
  • 运行时需要具备执行wmic命令的权限,普通用户权限即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:12:15