我想将我的应用发布到Playstore。所以我将app\build.gradle中的minSdkVersion从16更改为31。但是现在,当我构建Appbundle时,我遇到了这个错误。
执行任务“:app:processReleaseMainManifest”失败。
清单合并失败:android:exported需要为元素〈activity#com.example.debt.MainActivity〉显式指定。当相应组件定义了Intent过滤器时,面向Android 12及更高版本的应用需要为android:exported
指定显式值。https://developer.android.com/guide/topics/manifest/activity-element#exported有关详细信息,请参阅www.example.com。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.debt">
<application
android:label="Money Reminder"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
`
import 'package:flutter/material.dart';
import 'package:debt/colors.dart';
import 'package:debt/add.dart';
import 'package:debt/data.dart';
import 'package:flutter/foundation.dart';
import 'package:hive_flutter/hive_flutter.dart';
late Box box;
List<Data>datalist=[];
Future <void> main() async{
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
Hive.registerAdapter(DataAdapter());
box = await Hive.openBox("infos");
//wandelt die daten für die Anzeige um
Map<dynamic, dynamic> data2 = box.toMap();
//macht aus map liste
data2.forEach((key, value) {
if(kDebugMode){
Data w =Data (key, value);
datalist.add(w);
}
});
runApp(const MaterialApp(
home: debt(),
debugShowCheckedModeBanner: false,
));}
// ignore: camel_case_types
class debt extends StatefulWidget {
const debt({Key? key}) : super(key: key);
@override
_debtState createState() => _debtState();
}
// ignore: camel_case_types
class _debtState extends State<debt> {
Map<String, dynamic> values = {};
String text = 'Text';
double w = 100;
double h = 20;
Widget quoteTemplate(data){
return ValueListenableBuilder<Box>(
valueListenable: Hive.box('infos').listenable(),
builder: (context, box, widget) {
return
Card(
margin: const EdgeInsets.fromLTRB(16, 16, 16, 0),
child:Row(
mainAxisAlignment: MainAxisAlignment.spaceAround, // x Achse
crossAxisAlignment: CrossAxisAlignment.center, // y Achse
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.spaceAround, // x Achse
crossAxisAlignment: CrossAxisAlignment.center,// y Achse
children: <Widget>[
Container(alignment: Alignment.center,
width: 100,
height: h,
child: Text(
data.people,
style: TextStyle(
fontSize: 18,
color: Colors.grey[600],
)
),
),
const SizedBox(height: 6,),
Container(
alignment: Alignment.center,
child: Text(
data.money,
style: TextStyle(
fontSize: 14,
color: Colors.grey[800],
)
),
),
],
)
,Container(//delete
alignment: Alignment.center,
child: TextButton(style: TextButton.styleFrom(
),
onPressed: (){
box.delete(data.people);
setState(() {
Map<dynamic, dynamic> data2 = box.toMap();
datalist=[];
data2.forEach((key, value) {
if(kDebugMode){
Data w =Data (key, value);
datalist.add(w);
}
});
});
},
child: const Icon(Icons.delete,color: lightblue,),
),
),
Container(//minusbutton
alignment: Alignment.center,
child: TextButton(style: TextButton.styleFrom(//Minus Butten
),
onPressed: (){
var zwischenspeicher = box.get(data.people);
double zwischenspeicher2= double.parse(zwischenspeicher) - 1.0;
var schulden = zwischenspeicher2.toString();
box.put(data.people,schulden);
//Updatet das widget
setState(() {
Map<dynamic, dynamic> data2 = box.toMap();
datalist=[];
data2.forEach((key, value) {
if(kDebugMode){
Data w =Data (key, value);
datalist.add(w);
}
});
});
},
child: const Icon(Icons.remove,color: darkblue,),
),
),
Container(//plus Button
alignment: Alignment.center,
child: TextButton(style: TextButton.styleFrom(
),
onPressed: (){
var zwischenspeicher = box.get(data.people);
var zwischenspeicher2= double.parse(zwischenspeicher) + 1;
var schulden = zwischenspeicher2.toString();
box.put(data.people,schulden);
setState(() {
Map<dynamic, dynamic> data2 = box.toMap();
datalist=[];
data2.forEach((key, value) {
if(kDebugMode){
Data w =Data (key, value);
datalist.add(w);
}
});
});
},
child: const Icon(Icons.add,color: darkbrown,),
),
),
],
),
);});
}Widget buttond(){
return
Padding(
padding: const EdgeInsets.all(8.0),
child: Expanded(child: Align(
alignment: FractionalOffset.bottomRight,
child:
FloatingActionButton(
onPressed: () {
_awaitReturnValueFromSecondScreen(context);
},
child: const Icon(Icons.add),backgroundColor: lightbrown,
),),),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: lightblue ,
title: const Text("Money Reminder"),
centerTitle: true,
),
body:
Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
children: [
Column(
children: datalist.map((data)=> quoteTemplate(data)).toList(),
),
],
),
),bottomNavigationBar: Padding(
padding: const EdgeInsets.fromLTRB(20,0,20,10),
child:
ElevatedButton(
onPressed: () {
_awaitReturnValueFromSecondScreen(context);
},
//child: const Icon(Icons.add,color: Colors.white,),
child: const Text('add/edit debt',style: TextStyle(fontSize: 18,fontFamily: "Futura",color: Colors.white),),
style: ElevatedButton.styleFrom( backgroundColor:lightbrown,)
)
),
);
}
void _awaitReturnValueFromSecondScreen(BuildContext context) async {
// start the SecondScreen and wait for it to finish with a result
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const add(),
));
// after the SecondScreen result comes back update the Text widget with it
setState(() {
datalist = result;
});
}
}
`
The Problems of the manifest:
https://i.stack.imgur.com/kcZWN.png
https://i.stack.imgur.com/7lkfx.png
I tryed to Invalidate the cashe.
1条答案
按热度按时间s6fujrry1#
在你的
AndroidManifest.xml
文件activity
中这样写。