Flutter文件浏览器插件samba_browser的使用

Flutter文件浏览器插件samba_browser的使用

该插件能够使用SMB2规范对共享进行多种读操作。目前,支持以下实现:

  • Android(使用JCIFS库)
  • iOS(使用AMSMB2库)

免责声明! 该插件主要用于实验目的。因此当前提供的功能有限。 然而,我计划在未来扩展该插件。因此,如果您有任何建议或错误报告,我会非常感谢。您可以在我发布的GitHub Issue Board上提供。

示例

SambaBrowser.getShareList('smb://192.168.0.1/', 'domain.net', 'admin', 'password')
    .then((shares) => print('Shares found: ${shares.cast<String>()}'));
    
SambaBrowser.saveFile('./local/', 'downloaded.pdf', 'smb://192.168.0.1/example.pdf', 'domain.net', 'admin', 'password')
    .then((path) => print('File downloaded to: $path'));

完整示例代码

以下是完整的示例代码,展示了如何在Flutter应用中使用samba_browser插件来列出和下载共享文件。

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

void main() {
  runApp(const SambaApp());
}

class SambaApp extends StatefulWidget {
  const SambaApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<SambaApp> createState() => _SambaAppState();
}

class _SambaAppState extends State<SambaApp> {

  String shareUrl = '';
  String domain = '';
  String username = '';
  String password = '';

  Future<List>? shareFuture;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SAMBA插件示例应用'),
        ),
        body: SingleChildScrollView(
          child: Center(
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Column(
                children: [
                  TextFormField(
                    onChanged: (text) => shareUrl = text,
                    decoration: const InputDecoration(
                      border: UnderlineInputBorder(),
                      labelText: 'SAMBA共享URL',
                    ),
                  ),

                  TextFormField(
                    onChanged: (text) => domain = text,
                    decoration: const InputDecoration(
                      border: UnderlineInputBorder(),
                      labelText: '域',
                    ),
                  ),

                  Row(
                    children: [
                      Flexible(
                        child: TextFormField(
                          onChanged: (text) => username = text,
                          decoration: const InputDecoration(
                            border: UnderlineInputBorder(),
                            labelText: '用户名',
                          ),
                        ),
                      ),
                      const SizedBox(width: 15.0),
                      Flexible(
                        child: TextFormField(
                          onChanged: (text) => password = text,
                          obscureText: true,
                          decoration: const InputDecoration(
                            border: UnderlineInputBorder(),
                            labelText: '密码',
                          ),
                        ),
                      ),
                    ],
                  ),

                  TextButton(
                    onPressed: () => setState(() {
                      shareFuture = SambaBrowser.getShareList(shareUrl, domain, username, password);
                    }),
                    child: const Text("列出可用共享"),
                  ),

                  const SizedBox(height: 30.0),

                  if (shareFuture != null) FutureBuilder(future: shareFuture, builder: (context, snapshot) {
                    if (snapshot.hasError) {
                      return Column(
                        children: [
                          const Text('发生错误。'),
                          Text(snapshot.error.toString())
                        ]);
                    }

                    if (!snapshot.hasData) return const CircularProgressIndicator();

                    List<String> shares = (snapshot.data as List).cast<String>();
                    return Column(children: shares.map((e) => Text(e)).toList());
                  })
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文件浏览器插件samba_browser的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件浏览器插件samba_browser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用samba_browser插件来实现一个基本的Samba文件浏览器的示例代码。这个插件允许你通过SMB/CIFS协议访问网络上的共享文件夹。

首先,确保你已经在你的pubspec.yaml文件中添加了samba_browser依赖:

dependencies:
  flutter:
    sdk: flutter
  samba_browser: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以使用以下代码来创建一个简单的Samba文件浏览器。

主文件 main.dart

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Samba Browser Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SambaBrowserScreen(),
    );
  }
}

class SambaBrowserScreen extends StatefulWidget {
  @override
  _SambaBrowserScreenState createState() => _SambaBrowserScreenState();
}

class _SambaBrowserScreenState extends State<SambaBrowserScreen> {
  SambaBrowserController? _sambaBrowserController;
  List<SambaFile> _files = [];

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

  Future<void> _initSambaBrowser() async {
    _sambaBrowserController = SambaBrowserController(
      serverAddress: 'smb://your-server-address',
      username: 'your-username',
      password: 'your-password',
    );

    _sambaBrowserController!.listFiles().then((files) {
      setState(() {
        _files = files;
      });
    }).catchError((error) {
      print('Error listing files: $error');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Samba Browser Demo'),
      ),
      body: _files.isEmpty
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: _files.length,
              itemBuilder: (context, index) {
                final file = _files[index];
                return ListTile(
                  title: Text(file.name),
                  trailing: Icon(Icons.arrow_forward),
                  onTap: () {
                    // Handle file tap, e.g., navigate to details screen
                    print('File tapped: ${file.name}');
                  },
                );
              },
            ),
    );
  }

  @override
  void dispose() {
    _sambaBrowserController?.dispose();
    super.dispose();
  }
}

注意事项

  1. 权限和网络配置:确保你的应用有访问网络的权限,特别是在Android上,你可能需要在AndroidManifest.xml中请求INTERNET权限。

  2. 错误处理:示例代码中只简单地打印了错误。在实际应用中,你可能需要更详细的错误处理逻辑。

  3. 服务器地址和凭证:在_initSambaBrowser方法中,替换your-server-addressyour-usernameyour-password为你的实际Samba服务器地址和登录凭证。

  4. 依赖版本:请确保使用samba_browser插件的最新版本,因为API可能会随着版本更新而变化。

  5. 功能扩展:这个示例只是展示了如何列出文件。你可以根据需求扩展功能,比如下载文件、上传文件等。

  6. 跨平台考虑:虽然samba_browser插件支持多个平台,但请确保在目标平台上进行充分的测试。

希望这个示例能帮助你开始在Flutter项目中使用samba_browser插件!

回到顶部