Flutter Whelp实时聊天功能集成到Flutter应用程序中的插件whelp_flutter_sdk的用途

Flutter Whelp实时聊天功能集成到Flutter应用程序中的插件whelp_flutter_sdk的用途

whelp_flutter_sdk 是一个官方的Flutter包,用于将Whelp实时聊天功能集成到Flutter应用程序中。此插件允许开发者在他们的应用中添加实时聊天功能,并支持媒体附件(如图片和视频)。

安装与配置

安装步骤

首先,在你的 pubspec.yaml 文件中添加 whelp_flutter_sdk 作为依赖:

dependencies:
  flutter:
    sdk: flutter
  whelp_flutter_sdk: ^0.6.1

然后运行以下命令来安装包:

flutter pub get

配置

为了在实时聊天中使用媒体附件,需要在 AndroidManifest.xmlInfo.plist 中添加相应的权限。

Android

AndroidManifest.xml 中添加以下权限和提供者:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<provider 
    android:name="com.pichillilorenzo.flutter_inappwebview.InAppWebViewFileProvider" 
    android:authorities="${applicationId}.flutter_inappwebview.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">            
    <meta-data
      android:name="android.support.FILE_PROVIDER_PATHS"
      android:resource="@xml/provider_paths" />
</provider>

iOS

Info.plist 中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>Camera permission is required for live chat media attachments.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Photo library permission is required for live chat media attachments.</string>

使用示例

以下是完整的示例代码,展示如何使用 whelp_flutter_sdk 在Flutter应用中实现实时聊天功能。

示例代码

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

const whelpColor = Color(0xff194856);

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorSchemeSeed: whelpColor,
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late final TextEditingController _appIdController;
  late final TextEditingController _apiKeyController;
  late final TextEditingController _deviceIdController;
  late final TextEditingController _fullNameController;
  late final TextEditingController _phoneNumberController;
  late final TextEditingController _languageController;
  late final TextEditingController _emailController;
  late final TextEditingController _headerTitleController;
  IdentityIdentifier? _identifier;
  bool disableEmojiPicker = true;

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

    _appIdController = TextEditingController();
    _apiKeyController = TextEditingController();
    _deviceIdController = TextEditingController(text: '1234567890');
    _fullNameController = TextEditingController(text: 'John Doe');
    _phoneNumberController = TextEditingController(text: '+15555555555');
    _languageController = TextEditingController(text: 'EN');
    _emailController = TextEditingController(text: 'john@doe.com');
    _headerTitleController = TextEditingController(text: 'Custom Header Title');
    _identifier = IdentityIdentifier.email;
  }

  @override
  void dispose() {
    _appIdController.dispose();
    _apiKeyController.dispose();
    _deviceIdController.dispose();
    _fullNameController.dispose();
    _phoneNumberController.dispose();
    _languageController.dispose();
    _emailController.dispose();
    _headerTitleController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: whelpColor,
      appBar: AppBar(
        backgroundColor: whelpColor,
        centerTitle: true,
        title: Image.network(
          'https://whelp.co/blog/content/images/2023/01/Untitled-design-2-.png',
          height: 24.0,
        ),
      ),
      body: Container(
        decoration: const BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(24.0),
            topRight: Radius.circular(24.0),
          ),
        ),
        child: SingleChildScrollView(
          padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              _TextField(controller: _headerTitleController, labelText: 'Header Title'),
              const SizedBox(height: 16.0),
              _TextField(controller: _appIdController, labelText: 'App ID'),
              const SizedBox(height: 16.0),
              _TextField(controller: _apiKeyController, labelText: 'API Key'),
              const SizedBox(height: 16.0),
              _TextField(controller: _deviceIdController, labelText: 'Device ID'),
              const SizedBox(height: 16.0),
              _TextField(controller: _fullNameController, labelText: 'Full Name'),
              const SizedBox(height: 16.0),
              _TextField(controller: _languageController, labelText: 'Language'),
              const SizedBox(height: 16.0),
              _TextField(controller: _phoneNumberController, labelText: 'Phone Number'),
              const SizedBox(height: 16.0),
              _TextField(controller: _emailController, labelText: 'Email'),
              const SizedBox(height: 16.0),
              ListTile(
                contentPadding: EdgeInsets.zero,
                onTap: () {
                  showMenu<IdentityIdentifier>(
                    context: context,
                    position: const RelativeRect.fromLTRB(0, 0, 0, 0),
                    items: const [
                      PopupMenuItem(value: IdentityIdentifier.email, child: Text('E-mail')),
                      PopupMenuItem(value: IdentityIdentifier.phoneNumber, child: Text('Phone Number')),
                    ],
                  ).then((value) {
                    if (value != null) {
                      setState(() {
                        _identifier = value;
                      });
                    }
                  });
                },
                title: const Text('Identity with:'),
                trailing: Row(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Text(
                      _identifier == IdentityIdentifier.email ? 'Email' : 'Phone Number',
                      style: const TextStyle(fontSize: 14.0),
                    ),
                    const SizedBox(width: 4.0),
                    const Icon(Icons.keyboard_arrow_down),
                  ],
                ),
              ),
              const SizedBox(height: 8.0),
              SwitchListTile(
                dense: true,
                contentPadding: EdgeInsets.zero,
                title: const Text('Disable Emoji Picker', style: TextStyle(fontSize: 16.0)),
                value: disableEmojiPicker,
                onChanged: (value) {
                  setState(() {
                    disableEmojiPicker = value;
                  });
                },
              ),
              const SizedBox(height: 32.0),
              Center(
                child: FilledButton.icon(
                  style: FilledButton.styleFrom(
                    padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 32.0),
                  ),
                  onPressed: () {
                    final config = WhelpConfig(
                      appId: _appIdController.text,
                      apiKey: _apiKeyController.text,
                      deviceId: _deviceIdController.text,
                      disableEmojiPicker: disableEmojiPicker,
                      headerTitle: _headerTitleController.text,
                    );
                    final user = WhelpUser(
                      fullName: _fullNameController.text,
                      phoneNumber: _phoneNumberController.text,
                      language: _languageController.text,
                      email: _emailController.text,
                      identifier: _identifier!,
                    );

                    Navigator.of(context).push(
                      MaterialPageRoute(builder: (_) {
                        return _WhelpPage(config: config, user: user);
                      }),
                    );
                  },
                  label: const Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                    Text('Open Whelp', style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.w600)),
                  ]),
                  icon: const Icon(Icons.open_in_new),
                ),
              ),
              const SizedBox(height: 32.0),
            ],
          ),
        ),
      ),
    );
  }
}

class _TextField extends StatelessWidget {
  const _TextField({required this.controller, required this.labelText});

  final TextEditingController controller;
  final String labelText;

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: controller,
      decoration: InputDecoration(
        filled: true,
        labelText: labelText,
        border: const UnderlineInputBorder(),
        floatingLabelBehavior: FloatingLabelBehavior.auto,
      ),
    );
  }
}

class _WhelpPage extends StatelessWidget {
  const _WhelpPage({required this.config, required this.user});

  final WhelpConfig config;
  final WhelpUser user;

  @override
  Widget build(BuildContext context) {
    return WhelpScaffold(
      appBar: AppBar(centerTitle: false, title: const Text('Bizə yazın')),
      config: config,
      user: user,
      loadingBuilder: (BuildContext context) {
        return const Center(child: LinearProgressIndicator());
      },
      onUrlClick: (String url) {
        debugPrint('onUrlClick: $url');
      },
    );
  }
}

结论

通过 whelp_flutter_sdk 插件,开发者可以轻松地将实时聊天功能集成到他们的Flutter应用中。这个插件不仅提供了基本的聊天功能,还支持媒体附件、用户身份验证等功能,极大地增强了用户体验。


更多关于Flutter Whelp实时聊天功能集成到Flutter应用程序中的插件whelp_flutter_sdk的用途的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Whelp实时聊天功能集成到Flutter应用程序中的插件whelp_flutter_sdk的用途的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在探讨whelp_flutter_sdk这个Flutter插件的潜在用途时,由于这个插件的具体功能和实现细节可能不为大众所熟知(特别是如果它是一个较新的或者特定用途的插件),我们无法提供确切的使用建议。不过,基于Flutter插件开发的一般模式,我们可以展示一些代码案例,这些案例假设了插件可能具备的一些常见功能,并展示了如何在Flutter应用中使用这些功能。

请注意,以下代码仅作为示例,并不代表whelp_flutter_sdk的实际功能。实际使用时,你需要参考插件的官方文档和API。

假设的插件功能:数据收集与上传

假设whelp_flutter_sdk提供了数据收集(如用户行为数据)并上传到服务器的功能,我们可以这样使用它:

import 'package:flutter/material.dart';
import 'package:whelp_flutter_sdk/whelp_flutter_sdk.dart'; // 假设这是插件的导入路径

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  WhelpFlutterSdk? _sdk;

  @override
  void initState() {
    super.initState();
    // 初始化插件
    _sdk = WhelpFlutterSdk.instance;
    _sdk!.initialize('your_api_key_here'); // 假设插件需要API密钥进行初始化

    // 监听用户行为,例如按钮点击
    _sdk!.addListener(() {
      // 用户行为数据收集逻辑
      Map<String, dynamic> userData = {
        'action': 'button_click',
        'timestamp': DateTime.now().toIso8601String(),
      };
      _uploadUserData(userData);
    });
  }

  void _uploadUserData(Map<String, dynamic> data) async {
    try {
      await _sdk!.uploadData(data);
      print('User data uploaded successfully');
    } catch (e) {
      print('Failed to upload user data: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 模拟按钮点击事件
            print('Button clicked');
            // 在这里,插件的监听器应该已经捕获到这个点击事件
          },
          child: Text('Click Me'),
        ),
      ),
    );
  }
}

注意事项

  1. 插件文档:实际使用时,务必参考whelp_flutter_sdk的官方文档,了解如何正确初始化、配置和使用该插件。
  2. API密钥:如果插件需要API密钥,请确保安全地存储和使用这些密钥,避免泄露给未经授权的用户。
  3. 错误处理:在实际应用中,添加适当的错误处理逻辑,以应对插件初始化失败、数据上传失败等情况。
  4. 隐私政策:如果插件涉及用户数据的收集和处理,请确保你的应用遵守相关的隐私政策和法律法规。

由于whelp_flutter_sdk的具体功能未知,上述代码仅作为示例,展示了如何在Flutter应用中集成和使用一个假设的数据收集与上传插件。实际使用时,请根据插件的实际功能和API进行调整。

回到顶部