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

