Flutter世界时间App在Android Studio中运行时错误求助
Flutter世界时间App运行时错误排查与解决
问题描述
开发一款基于worldtimeapi的Flutter世界时间App,能正常获取API输出,但始终存在运行时错误。已在build.gradle中添加依赖,确认API与HTTP协议正常,推测问题出在系统配置。
代码片段(loading.dart)
import 'package:flutter/material.dart'; import 'dart:convert'; import 'package:http/http.dart'; class Loading extends StatefulWidget { const Loading({Key? key}) : super(key: key); @override State<Loading> createState() => _LoadingState(); } class _LoadingState extends State<Loading> { void getTime() async{ // Make the request using http.get Response response = await get(Uri.http('worldtimeapi.org', '/api/timezone/Asia/Karachi')); Map<String, dynamic> data = jsonDecode(response.body); print(data); // Get properties from data String datetime = data['datetime']; String offset = data['utc_offset']; print(datetime); print(offset); // Create DateTime object DateTime now = DateTime.parse(datetime); print(now); } @override void initState() { super.initState(); getTime(); // Async func print('hey there!'); } @override Widget build(BuildContext context) { return Scaffold( body: Text('loading screen'), ); } }
错误日志片段
E/AndroidRuntime(22278): E/AndroidRuntime(22457): at android.app.ActivityThread.installProvider(ActivityThread.java:7754) E/AndroidRuntime(22457): at android.app.ActivityThread.acquireProvider(ActivityThread.java:7352) E/AndroidRuntime(22457): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:3668) E/AndroidRuntime(22457): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:2542) E/AndroidRuntime(22457): at android.content.ContentResolver.query(ContentResolver.java:1213) E/AndroidRuntime(22457): at android.content.ContentResolver.query(ContentResolver.java:1161) E/AndroidRuntime(22457): at android.content.ContentResolver.query(ContentResolver.java:1117) E/AndroidRuntime(22457): at cmkx.k(:com.google.android.gms@231818044@23.18.18 (190400-535401451):2) E/AndroidRuntime(22457): at cmkx.l(:com.google.android.gms@231818044@23.18.18 (190400-535401451):1) E/AndroidRuntime(22457): at cmkx.e(:com.google.android.gms@231818044@23.18.18 (190400-535401451):4) E/AndroidRuntime(22457): at cvdn.a(:com.google.android.gms@231818044@23.18.18 (190400-535401451):0) E/AndroidRuntime(22457): at cvdk.a(:com.google.android.gms@231818044@23.18.18 (190400-535401451):1) E/AndroidRuntime(22457): at cvdp.a(:com.google.android.gms@231818044@23.18.18 (190400-535401451):2) E/AndroidRuntime(22457): at cvep.m(:com.google.android.gms@231818044@23.18.18 (190400-535401451):6) E/AndroidRuntime(22457): at cvep.g(:com.google.android.gms@231818044@23.18.18 (190400-535401451):11) E/AndroidRuntime(22457): at egur.B(:com.google.android.gms@231818044@23.18.18 (190400-535401451):0) E/AndroidRuntime(22457): at com.google.android.gms.chimera.GmsAppComponentFactory.instantiateProvider(:com.google.android.gms@231818044@23.18.18 (190400-535401451):9) E/AndroidRuntime(22457): at android.app.ActivityThread.installProvider(ActivityThread.java:7754) E/AndroidRuntime(22457): at android.app.ActivityThread.acquireProvider(ActivityThread.java:7352) E/AndroidRuntime(22457): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:3668) E/AndroidRuntime(22457): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:2542) E/AndroidRuntime(22457): at android.content.ContentResolver.query(ContentResolver.java:1213) E/AndroidRuntime(22457): at android.content.ContentResolver.query(ContentResolver.java:1161) E/AndroidRuntime(22457): at android.content.ContentResolver.query(ContentResolver.java:1117) E/AndroidRuntime(22457): at cmkx.k(:com.google.android.gms@231818044@23.18.18 (190400-535401451):2) E/AndroidRuntime(22457): at cmkx.l(:com.google.android.gms@231818044@23.18.18 (190400-535401451):1) E/AndroidRuntime(22457): at cmkx.e(:com.google.android.gms@231818044@23.18.18 (190400-535401451):4) E/AndroidRuntime(22457): at cvdn.a(:com.google.android.gms@231818044@23.18.18 (190400-5354
解决步骤
1. 配置Android网络权限与明文HTTP访问(若需)
- 打开
android/app/src/main/AndroidManifest.xml,添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 优先改用HTTPS请求(worldtimeapi支持HTTPS),修改代码中的请求地址:
Response response = await get(Uri.https('worldtimeapi.org', '/api/timezone/Asia/Karachi')); - 若必须使用HTTP,需创建网络安全配置文件:
在android/app/src/main/res/xml下新建network_security_config.xml:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">worldtimeapi.org</domain> </domain-config> </network-security-config>AndroidManifest.xml的<application>标签中引用:android:networkSecurityConfig="@xml/network_security_config"
2. 添加异步请求错误处理
当前代码未处理API请求的异常情况,可能导致崩溃。修改getTime()方法:
void getTime() async{ try { Response response = await get(Uri.https('worldtimeapi.org', '/api/timezone/Asia/Karachi')); if (response.statusCode == 200) { Map<String, dynamic> data = jsonDecode(response.body); print(data); // 空值判断避免空指针 String datetime = data['datetime'] ?? ''; String offset = data['utc_offset'] ?? ''; print(datetime); print(offset); if (datetime.isNotEmpty) { DateTime now = DateTime.parse(datetime); print(now); } } else { print('API请求失败,状态码:${response.statusCode}'); } } catch (e) { print('请求出错:$e'); } }
3. 解决Google Play Services冲突
从错误日志看,崩溃与Google Play Services的Provider初始化相关,尝试以下操作:
- 清理项目缓存:执行
flutter clean,再运行flutter pub get - 更新Flutter及依赖:运行
flutter upgrade,并将pubspec.yaml中的http包更新至最新版本 - 确保测试设备/模拟器的Google Play Services已更新到最新版本
内容的提问来源于stack exchange,提问作者Gurshan Singh
相关产品推荐
相关产品推荐

