如何修复Flutter添加Rive动画后Mat2D隐式复制赋值运算符已弃用错误?
添加Rive动画到Flutter应用启动页后,Windows编译出现以下错误:
C:\Users\d\Desktop\Flutter Real Projects\weather_app\windows\flutter\ephemeral.plugin_symlinks\rive_common\windows..\ios\rive-cpp\include\rive/math/mat2d.hpp(17,5): error : definition of implicit copy assignment operator for 'Mat2D' is deprecated because it has a user-declared copy constructor [-Werror,-Wdeprecated-copy] [C:\Users\d\Desktop\Flutter Real Projects\weather_app\build\windows\plugins\rive_common\rive_common_plugin.vcxproj]
Exception: Build process failed.
使用的启动页代码如下:
import 'package:animated_splash_screen/animated_splash_screen.dart'; import 'package:flutter/material.dart'; import 'package:rive/rive.dart'; import 'package:weather_app/pages/home_page.dart'; class Splash extends StatelessWidget { const Splash({super.key}); @override Widget build(BuildContext context) { return Container( color: Colors.red, child: AnimatedSplashScreen( splashTransition: SplashTransition.fadeTransition, backgroundColor: Colors.amber, splash: const RiveAnimation.asset('assets/images/anim.riv'), nextScreen: const HomePage(), ), ); } }
解决方案
升级Rive依赖版本:这个报错是rive-cpp底层的编译警告被触发为错误,新版本的rive包已经修复了该问题。在
pubspec.yaml中将rive依赖更新到最新稳定版,示例:dependencies: rive: ^0.12.0 # 替换为当前最新稳定版本执行
flutter pub get更新依赖后重新编译。禁用Windows编译的-Wdeprecated-copy警告:如果暂时无法升级依赖,可修改Windows项目的编译配置忽略该警告:
- 打开项目路径下的
build/windows/plugins/rive_common/rive_common_plugin.vcxproj文件 - 在
<ClCompile>节点中添加忽略警告的参数,修改后示例:<ClCompile> <WarningLevel>Level3</WarningLevel> <AdditionalOptions>$(AdditionalOptions) -Wno-deprecated-copy</AdditionalOptions> </ClCompile> - 保存文件后重新执行
flutter run -d windows
- 打开项目路径下的
替换启动页实现方式:若上述方法无效,可弃用
animated_splash_screen包,手动实现Rive动画启动页跳转,避免潜在冲突:import 'package:flutter/material.dart'; import 'package:rive/rive.dart'; import 'package:weather_app/pages/home_page.dart'; class Splash extends StatefulWidget { const Splash({super.key}); @override State<Splash> createState() => _SplashState(); } class _SplashState extends State<Splash> { @override void initState() { super.initState(); // 可根据动画播放状态调整跳转时机,这里用固定延迟示例 Future.delayed(const Duration(seconds: 3), () { Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const HomePage())); }); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.amber, body: Center( child: RiveAnimation.asset('assets/images/anim.riv'), ), ); } }
内容的提问来源于stack exchange,提问作者borhanedine

