Flutter微信功能集成插件wx_box的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter微信功能集成插件wx_box的使用

wx_box 是一个用于在 Flutter 中创建具有可定制高度的盒子布局的插件。它允许你轻松地创建矩形、圆形、椭圆等形状的盒子,并且可以自定义颜色、边框、阴影等属性。

使用说明

要了解更多关于 wx_box 类及其引用的其他类,请参阅 API 参考文档

示例代码

// 创建一个简单的矩形盒子
WxBox(
  width: 50,
  height: 50,
)

// 创建一个带阴影的圆形盒子
WxBox.circle(
  color: Colors.amber,
  radius: 25,
  borderWidth: 5,
  borderStyle: BorderStyle.solid,
  borderColor: Theme.of(context).colorScheme.surface,
  borderOffset: BorderSide.strokeAlignOutside,
  alignment: Alignment.center,
  child: Text(
    '1',
    style: Theme.of(context).textTheme.titleLarge,
  ),
)

// 创建一个椭圆形盒子
WxBox.stadium(
  color: Colors.amber,
  width: 150,
  height: 50,
  borderSide: BorderSide(
    width: 5,
    style: BorderStyle.solid,
    color: Colors.black,
    strokeAlign: BorderSide.strokeAlignOutside,
  ),
  alignment: Alignment.center,
  child: Text(
    'text',
    style: Theme.of(context).textTheme.titleLarge,
  ),
)

完整示例

以下是一个完整的 Flutter 应用程序示例,展示了如何使用 wx_box 插件来创建不同形状和样式的盒子。

import 'package:flutter/material.dart';
import 'package:wx_box/wx_box.dart';
import 'package:wx_text/wx_text.dart';
import 'package:wx_anchor/wx_anchor.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WxBox Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: false,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const SizedBox(height: 40),
              const WxText.displayMedium('WxBox'),
              const SizedBox(height: 40),
              const Wrapper(
                title: 'Rectangle Shape',
                child: Wrap(
                  crossAxisAlignment: WrapCrossAlignment.center,
                  spacing: 20,
                  children: [
                    WxAnimatedBox(
                      alignment: Alignment.center,
                      constraints: BoxConstraints(
                        minHeight: 45,
                        maxWidth: 100,
                      ),
                      color: Colors.amber,
                      padding: EdgeInsets.symmetric(
                        horizontal: 20,
                        vertical: 5,
                      ),
                      borderStyle: BorderStyle.solid,
                      borderColor: Colors.red,
                      borderWidth: 1,
                      borderOffset: 7,
                      borderRadius: BorderRadius.all(Radius.circular(5)),
                      child: Text(
                        'Text',
                        style: TextStyle(
                          height: 1.15,
                        ),
                      ),
                    ),
                    WxBox.square(
                      size: 45,
                      borderRadius: BorderRadius.all(Radius.circular(4)),
                      alignment: Alignment.center,
                      color: Colors.amber,
                      child: Text(
                        'Text',
                        style: TextStyle(
                          height: 1.15,
                        ),
                      ),
                    ),
                    WxBox.square(
                      borderWidth: 1,
                      borderStyle: BorderStyle.solid,
                      borderColor: Colors.black87,
                      borderOffset: BorderSide.strokeAlignOutside,
                      borderRadius: BorderRadius.all(Radius.circular(4)),
                      padding: EdgeInsets.all(5),
                      child: Text(
                        'Text',
                        style: TextStyle(
                          height: 1.15,
                        ),
                      ),
                    ),
                  ],
                ),
              ),
              const SizedBox(height: 20),
              const Wrapper(
                title: 'Circle Shape',
                child: Wrap(
                  crossAxisAlignment: WrapCrossAlignment.center,
                  spacing: 20,
                  children: [
                    WxBox.circle(
                      elevation: 2,
                      color: Colors.amber,
                      padding: EdgeInsets.all(10),
                      child: Text(
                        '9',
                        style: TextStyle(
                          height: 1.2,
                        ),
                      ),
                    ),
                    WxAnimatedBox.circle(
                      radius: 25,
                      alignment: Alignment.center,
                      shadows: [
                        BoxShadow(
                          color: Colors.grey,
                          spreadRadius: 3,
                          blurRadius: 3,
                          offset: Offset(0, 0), // 改变阴影的位置
                        ),
                      ],
                      gradient: LinearGradient(
                        colors: [
                          Colors.teal,
                          Colors.indigo,
                        ],
                      ),
                      child: Text(
                        'Text',
                        style: TextStyle(
                          color: Colors.white,
                          height: 1.15,
                        ),
                      ),
                    ),
                    ElevatedBox(),
                  ],
                ),
              ),
              const SizedBox(height: 20),
              Wrapper(
                title: 'Stadium Shape',
                child: Wrap(
                  crossAxisAlignment: WrapCrossAlignment.center,
                  spacing: 20,
                  children: [
                    const WxBox.stadium(
                      color: Colors.amber,
                      padding: EdgeInsets.symmetric(
                        horizontal: 20,
                        vertical: 5,
                      ),
                      child: Text(
                        'Text',
                        style: TextStyle(
                          height: 1.15,
                        ),
                      ),
                    ),
                    WxAnimatedBox.stadium(
                      width: 150,
                      height: 50,
                      borderWidth: 1,
                      borderStyle: BorderStyle.solid,
                      borderColor: Theme.of(context).colorScheme.onSurface,
                      borderOffset: BorderSide.strokeAlignOutside,
                      clipBehavior: Clip.antiAlias,
                      child: Material(
                        type: MaterialType.transparency,
                        child: InkWell(
                          onTap: () {},
                          child: Center(
                            child: Text(
                              'Text',
                              style: Theme.of(context)
                                  .textTheme
                                  .titleLarge
                                  ?.copyWith(height: 1.15),
                            ),
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
              const SizedBox(height: 40),
            ],
          ),
        ),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<ElevatedBox> createState() => _ElevatedBoxState();
}

class _ElevatedBoxState extends State<ElevatedBox> {
  bool _isHover = false;
  bool _isPressed = false;

  _setIsHover(bool val) {
    setState(() => _isHover = val);
  }

  _setIsPressed(bool val) {
    setState(() => _isPressed = val);
  }

  double get _elevation =>
      _isPressed
          ? 0
          : _isHover
              ? 3
              : 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return WxAnchor.circle(
      radius: 25,
      onHover: (hover) => _setIsHover(hover),
      onTapUp: (_) => _setIsPressed(false),
      onTapDown: (_) => _setIsPressed(true),
      onTapCancel: () => _setIsPressed(false),
      child: WxAnimatedBox.circle(
        elevation: _elevation,
        radius: 25,
        color: Colors.amber,
        alignment: Alignment.center,
        child: const Text(
          'Text',
          style: TextStyle(
            color: Colors.white,
            height: 1.15,
          ),
        ),
      ),
    );
  }
}

class Wrapper extends StatelessWidget {
  const Wrapper({
    super.key,
    required this.title,
    required this.child,
  });

  final String title;
  final Widget child;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        Padding(
          padding: const EdgeInsets.fromLTRB(10, 0, 0, 0),
          child: WxText.labelLarge(title),
        ),
        SizedBox(
          width: 300,
          height: 100,
          child: Card.outlined(
            child: Padding(
              padding: const EdgeInsets.all(15.0),
              child: Center(child: child),
            ),
          ),
        ),
      ],
    );
  }
}

更多关于Flutter微信功能集成插件wx_box的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter微信功能集成插件wx_box的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成微信功能,你可以使用wx_box这个插件。wx_box是一个用于集成微信登录、支付等功能的Flutter插件。以下是一个基本的代码示例,展示如何在Flutter项目中集成并使用wx_box插件。

1. 添加依赖

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

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

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

2. 配置Android和iOS

Android配置

android/app/src/main/AndroidManifest.xml中添加微信SDK所需的权限和Activity配置:

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

<application
    ... >
    <activity
        android:name=".wxapi.WXEntryActivity"
        android:exported="true"
        android:launchMode="singleTop"
        android:theme="@android:style/Theme.Translucent.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="你的APPID"/>  <!-- 替换为你的微信APPID -->
        </intent-filter>
    </activity>
</application>

创建wxapi包和WXEntryActivity类:

android/app/src/main/java/com/yourpackage/(替换为你的包名)下创建wxapi包,并在其中添加WXEntryActivity.java

package com.yourpackage.wxapi;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, "你的APPID", false);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {}

    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) {
            if (resp.errCode == BaseResp.ErrCode.ERR_OK) {
                Toast.makeText(this, "分享成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "分享失败", Toast.LENGTH_SHORT).show();
            }
        }
        finish();
    }
}

iOS配置

ios/Runner/Info.plist中添加微信SDK所需的配置:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>weixin</string>
    <string>weixinqbapi</string>
</array>
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>你的APPID</string>  <!-- 替换为你的微信APPID -->
        </array>
    </dict>
</array>

ios/Runner/目录下创建WXApiHandler.swift(如果已存在则无需创建):

import UIKit
import WeChatSDK

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)
        
        WXApi.registerApp("你的APPID", with: self)  // 替换为你的微信APPID
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return WXApi.handleOpen(url, delegate: self)
    }
}

extension AppDelegate: WXApiDelegate {
    func onReq(_ req: BaseReq) {
        // 处理微信请求
    }
    
    func onResp(_ resp: BaseResp) {
        if resp.type == WXResponseType.sendMessageToWX {
            if resp.errCode == WXErrCode.success {
                // 分享成功
            } else {
                // 分享失败
            }
        }
    }
}

3. 使用wx_box插件

在你的Flutter代码中,你可以这样使用wx_box插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('微信功能集成示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _loginWithWeChat,
            child: Text('微信登录'),
          ),
        ),
      ),
    );
  }

  Future<void> _loginWithWeChat() async {
    try {
      // 初始化微信SDK(通常在应用启动时调用一次)
      await WXBox.init("你的APPID");  // 替换为你的微信APPID
      
      // 发起微信登录
      var result = await WXBox.login();
      print("微信登录结果: $result");
    } catch (e) {
      print("微信登录失败: $e");
    }
  }
}

请确保你已经正确配置了微信开放平台的APPID和相关权限,并且已经在微信开放平台上注册了你的应用。

注意:这只是一个基本的示例,实际应用中你可能需要处理更多的错误情况和用户交互。另外,由于微信SDK的更新和Flutter插件的维护情况,代码可能需要根据你的具体需求和环境进行调整。

回到顶部