SharedPreferences 未在发布版本中实例化
SharedPreferences not instantiating in release build
在我的 flutter 应用程序中,我实现了一个入职视图。因为它应该只加载一次,所以我使用共享首选项来存储一个整数以指示已经显示了入职。当我 运行 应用程序处于调试模式时,一切正常。但是当我构建它的发布版本时,它不起作用。
而且我的应用程序使用了 firebase 移动身份验证。我提到这个,因为这可能也是一个原因。
代码:
case InitializeEvent:
SharedPreferences prefs = await SharedPreferences.getInstance();
int initScreen = prefs.getInt(SharedPrefUtil.INIT_SCREEN);
await prefs.setInt(SharedPrefUtil.INIT_SCREEN, 1);
if (initScreen == 1) {
add(CheckAppConfigEvent());
} else {
yield state.clone(page: RootState.ONBOARDING_PAGE);
}
yield state.clone(loading: false);
break;
所以在上面的代码中,如果我注释初始化共享 pref、读取和写入行并在 if else 语句中设置 true 或 false,那么在发布版本中一切正常。这就是为什么我认为问题在于初始化共享首选项。
而且我只允许上网。我是否缺少 AndroidManifest.xml
中的任何权限
<uses-permission android:name="android.permission.INTERNET"/>
用 flutter build apk 构建 --no-shrink 给我解决了
我的应用程序在发布版本中也无法正常工作,问题是由于 shared_preferences 包造成的。
我在发布版本中遇到以下错误:
MissingPluginException(未在通道 plugins.flutter.io/shared_preferences 上找到方法 getAll 的实现)
我尝试了几种解决方案:
- 切换flutter频道
- 尝试了几个版本的shared_preferences
- 按照此处所述删除 .pub-cache 文件夹 https://github.com/flutter/flutter/issues/38873#issuecomment-680788165
但没有任何效果。
该应用程序在调试版本中运行良好,但在发布版本中运行不佳。
然后我试了
flutter build apk --no-shrink
flutter build appbundle --no-shrink
并且该应用程序在发布版本中也运行良好。但是这个问题在没有缩小代码的情况下得到了解决。
所以这需要修复。
希望 Flutter 团队能够调查并解决这个问题。
编辑:
已将问题报告给 Flutter 团队。
https://github.com/flutter/flutter/issues/65334
我也遇到了同样的问题。在我的例子中,问题不是我的代码,问题是 Gradle 版本,当我使用任何大于 4 的 Gradle 版本时,就会出现这个问题。但是当我将 Gradle 版本降低到 3.5.0 时,它工作正常。我还用 Gradle 3.6.4 测试过它也能正常工作。
改变这个
dependencies {
classpath 'com.android.tools.build:gradle:4.1.1'
}
到
dependencies {
classpath 'com.android.tools.build:gradle:3.6.4'
}
注意:在 flutter 中不要总是升级你的 Gradle 版本
将 classpath 'com.android.tools.build:gradle:4.1.0'
替换为
classpath 'com.android.tools.build:gradle:3.5.0'
在 android/build.gradle 文件中为我解决了问题
对我来说真的很管用,你可以试试----
使用 -> SharedPreferences.setMockInitialValues({});
void main() {
SharedPreferences.setMockInitialValues({});
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
systemNavigationBarColor: Colors.indigo[900], // navigation bar color
statusBarColor: Colors.indigo[900],
systemNavigationBarIconBrightness: Brightness.light));
runApp(MyApp());
}
可能你忘了在MainActivity.java上添加这行代码
`@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this.getFlutterEngine());
}`
它对我有用
我刚改了:
dependencies {
classpath 'com.android.tools.build:gradle:**4.1.0**'
}
TO
dependencies {
classpath 'com.android.tools.build:gradle:**3.5.0**'
}
然后
- 扑扑干净
- flutter build apk --release
它肯定会起作用。
以前的解决方案在我的情况下不起作用,然后我尝试禁用这两个然后它起作用了。
minifyEnabled false
shrinkResources false
在我的 flutter 应用程序中,我实现了一个入职视图。因为它应该只加载一次,所以我使用共享首选项来存储一个整数以指示已经显示了入职。当我 运行 应用程序处于调试模式时,一切正常。但是当我构建它的发布版本时,它不起作用。
而且我的应用程序使用了 firebase 移动身份验证。我提到这个,因为这可能也是一个原因。
代码:
case InitializeEvent:
SharedPreferences prefs = await SharedPreferences.getInstance();
int initScreen = prefs.getInt(SharedPrefUtil.INIT_SCREEN);
await prefs.setInt(SharedPrefUtil.INIT_SCREEN, 1);
if (initScreen == 1) {
add(CheckAppConfigEvent());
} else {
yield state.clone(page: RootState.ONBOARDING_PAGE);
}
yield state.clone(loading: false);
break;
所以在上面的代码中,如果我注释初始化共享 pref、读取和写入行并在 if else 语句中设置 true 或 false,那么在发布版本中一切正常。这就是为什么我认为问题在于初始化共享首选项。
而且我只允许上网。我是否缺少 AndroidManifest.xml
中的任何权限<uses-permission android:name="android.permission.INTERNET"/>
用 flutter build apk 构建 --no-shrink 给我解决了
我的应用程序在发布版本中也无法正常工作,问题是由于 shared_preferences 包造成的。
我在发布版本中遇到以下错误:
MissingPluginException(未在通道 plugins.flutter.io/shared_preferences 上找到方法 getAll 的实现)
我尝试了几种解决方案:
- 切换flutter频道
- 尝试了几个版本的shared_preferences
- 按照此处所述删除 .pub-cache 文件夹 https://github.com/flutter/flutter/issues/38873#issuecomment-680788165
但没有任何效果。
该应用程序在调试版本中运行良好,但在发布版本中运行不佳。
然后我试了
flutter build apk --no-shrink
flutter build appbundle --no-shrink
并且该应用程序在发布版本中也运行良好。但是这个问题在没有缩小代码的情况下得到了解决。 所以这需要修复。
希望 Flutter 团队能够调查并解决这个问题。
编辑:
已将问题报告给 Flutter 团队。
https://github.com/flutter/flutter/issues/65334
我也遇到了同样的问题。在我的例子中,问题不是我的代码,问题是 Gradle 版本,当我使用任何大于 4 的 Gradle 版本时,就会出现这个问题。但是当我将 Gradle 版本降低到 3.5.0 时,它工作正常。我还用 Gradle 3.6.4 测试过它也能正常工作。
改变这个
dependencies {
classpath 'com.android.tools.build:gradle:4.1.1'
}
到
dependencies {
classpath 'com.android.tools.build:gradle:3.6.4'
}
注意:在 flutter 中不要总是升级你的 Gradle 版本
将 classpath 'com.android.tools.build:gradle:4.1.0'
替换为
classpath 'com.android.tools.build:gradle:3.5.0'
在 android/build.gradle 文件中为我解决了问题
对我来说真的很管用,你可以试试----
使用 -> SharedPreferences.setMockInitialValues({});
void main() {
SharedPreferences.setMockInitialValues({});
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
systemNavigationBarColor: Colors.indigo[900], // navigation bar color
statusBarColor: Colors.indigo[900],
systemNavigationBarIconBrightness: Brightness.light));
runApp(MyApp());
}
可能你忘了在MainActivity.java上添加这行代码 `@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this.getFlutterEngine());
}`
它对我有用
我刚改了:
dependencies {
classpath 'com.android.tools.build:gradle:**4.1.0**'
}
TO
dependencies {
classpath 'com.android.tools.build:gradle:**3.5.0**'
}
然后
- 扑扑干净
- flutter build apk --release
它肯定会起作用。
以前的解决方案在我的情况下不起作用,然后我尝试禁用这两个然后它起作用了。
minifyEnabled false
shrinkResources false