Flutter 发布的 apk 不起作用,但调试 apk 工作正常

时间:2021-06-19 12:26:16

标签: flutter dart debugging setstate release-apk

_getMessages() 函数用于从手机获取 SMS 消息并将其存储在 _messages 中。此外,在 UI 部分,我有一个重新加载按钮 (floatingActionButton),它调用 _getMessages()。现在,预期的行为是,一旦打开应用程序,就应该获取现有消息并显示,对于稍后到达的新消息,要在屏幕上查看它们,用户可以按下重新加载按钮,再次调用 _getMessages() 并显示新消息。

这段代码在debug apk中有效,但是发布的apk安装在其他设备上(非调试模式)时,应用程序不起作用。另外,我使用 Telephony 来获取消息。是不是因为函数和变量在 _HomeState 中定义的方式?所以,我不确定错误是代码还是包。提前致谢。

import 'package:OffQuiz/home/Quiz/quizCard.dart';
import 'package:OffQuiz/shared/appBar.dart';
import 'package:flutter/material.dart';
import 'package:telephony/telephony.dart';

class Home extends StatefulWidget {
  Home({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final telephony = Telephony.instance;
  List<SmsMessage> _messages = [];

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

  Future<void> _getMessages() async {
    List<SmsMessage> temp;
    temp = await telephony
        .getInboxSms(columns: [SmsColumn.ADDRESS, SmsColumn.BODY]);
    setState(() {
      _messages = temp;
    });
  }

  @override
  Widget build(BuildContext context) {
    // getMessages();

    return Scaffold(
      appBar: appBar("OffQuiz"),
      body: _messages.length != 0
          ? ListView(
              children: _messages
                  .map((quiz) => QuizCard(
                        quiz: quiz,
                      ))
                  .toList(),
            )
          : Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Text(
                    "Please reload to fetch the latest messages",
                    style: TextStyle(
                        fontSize: 20,
                        fontWeight: FontWeight.w400,
                        color: Colors.grey),
                  ),
                ],
              ),
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: _getMessages,
        child: Icon(
          Icons.refresh,
          color: Colors.white,
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:0)

以下对我有用,但您可以尝试以下方法,它很可能在大多数情况下都有效。

  1. 添加 android/app/proguard-rules.pro
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-keep class androidx.lifecycle.** { *; } 
-keep @interface com.google.gson.annotations.SerializedName
-keep @interface com.google.gson.annotations.Expose
-keepattributes *Annotation*
 #https://github.com/flutter/flutter/issues/58479
 #https://medium.com/@swav.kulinski/flutter-and-android-obfuscation-8768ac544421
  1. 在应用级 build.gradle 中为 buildTypes 添加 proguard
buildTypes {
release {
    profile {
        matchingFallbacks = ['debug', 'release']
    }
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
lintOptions {
  disable 'InvalidPackage'
  checkReleaseBuilds false
}
  1. 编辑 MainActivity.kt(主要活动 kotlin 文件):
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
     override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
      GeneratedPluginRegistrant.registerWith(flutterEngine);
  }
}