我在 Flutter 中遇到了最奇怪的行为,我一生都无法弄清楚为什么会发生这种情况。无论如何,这都不是一个严重的错误,我只是很恼火,找不到原因!
我有一个 Flutter 应用程序,是为 iOS 和 Android 构建的。依赖项Package Info Plus用于使用这个简单的小部件检索应用程序版本和内部版本号:
class AppVersionWidget extends StatelessWidget {
const AppVersionWidget({super.key});
@override
Widget build(BuildContext context) => FutureBuilder<String>(
future: _getAppVersion(),
builder: (context, snapshot) => snapshot.hasData
? Text(
'v${snapshot.data}',
style: context.textTheme.bodySmall!.apply(
color: context.customColorScheme?.whiteFixed,
),
textAlign: TextAlign.center,
)
: const SizedBox.shrink(),
);
Future<String> _getAppVersion() async {
final packageInfo = await PackageInfo.fromPlatform();
final appVersion = packageInfo.version;
final buildVersion = packageInfo.buildNumber;
return '$appVersion ($buildVersion)';
}
}
在 iOS 上,这是完美的,如果应用程序版本是
1.0.0
并且内部版本号是 123
,它将输出 1.0.0 (123)
。然而在 Android 上,它输出 1.0.0 (2123)
。我尝试过不同的内部版本号,并意识到在 Android 上,数字 2000 始终添加到内部版本号中。如果我将内部版本号更改为12345
,它将输出14345
。为什么???
我做了一些调试,在
build.gradle
我添加了以下内容:
println "Debug Output: Version Code = ${flutterVersionCode}"
println "Debug Output: Version Name = ${flutterVersionName}"
在 Android 构建过程中,它正确输出:
Debug Output: Version Code = 123
Debug Output: Version Name = 1.0.0
当我搜索它时,似乎没有其他人遇到这个问题,所以我真的不知道还能尝试什么或者原因可能是什么?!
看起来像是软件包的一个错误。尝试在Android部分实现它。 创建方法通道:
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,CHANNEL)
并设置呼叫处理程序
channel.setMethodCallHandler { call, result ->
if (call.method == "appversion") {
val versionString = "${BuildConfig.VERSION_NAME} - ${BuildConfig.VERSION_CODE}"
result.success(versionString)
}
}
现在在你的 dart 部分创建一个类似的类
class AppInfo {
final MethodChannel methodChannel = const MethodChannel("channel");
Future<String> getAppVersion() async {
final ver = await methodChannel.invokeMethod("appversion");
return ver;
}
}
现在您可以通过
获取版本await AppInfo().getAppVersion();