Приложение Flutter аварийно завершает работу только на устройстве AndroidAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Приложение Flutter аварийно завершает работу только на устройстве Android

Сообщение Anonymous »

Мне действительно нужна помощь в этом. Я пробую это уже много дней и до сих пор не могу понять проблему.
Когда я запускаю это приложение в симуляторе iOS, оно работает нормально, но когда я запускаю его на любом устройстве Android, оно работает вылетает сразу. Я не вижу проблемы.
Моя консоль отладки после запуска приложения дает сбой

Код: Выделить всё

Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
✓ Built build/app/outputs/flutter-apk/app-debug.apk
D/FlutterGeolocator( 2637): Attaching Geolocator to activity
D/FlutterGeolocator( 2637): Creating service.
D/FlutterGeolocator( 2637): Binding to location service.
D/FlutterLocationService( 2637): Creating service.
D/FlutterLocationService( 2637): Binding to location service.
D/FlutterGeolocator( 2637): Geolocator foreground service connected
D/FlutterGeolocator( 2637): Initializing Geolocator services
D/FlutterGeolocator( 2637): Flutter engine connected. Connected engine count 1
Connecting to VM Service at ws://127.0.0.1:63706/2UBZY5eep1A=/ws
Connected to the VM Service.
I/flutter ( 2637): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmU3ZmEwMjliZGZlMTAwNmUzOTY0MzkiLCJpYXQiOjE3MjcxNzMyNTMsImV4cCI6MTc0Mjk0MTI1MywidHlwZSI6ImFjY2VzcyJ9.b0PWqexRxdiypAdbi8mdn14JQaYdLPerEryw3k1sVTU
I/flutter ( 2637): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmU3ZmEwMjliZGZlMTAwNmUzOTY0MzkiLCJpYXQiOjE3MjcxNzMyNTMsImV4cCI6MTc1ODcwOTI1MywidHlwZSI6InJlZnJlc2gifQ.xu95VDDLfimL0nAiMvM0ZD2R6REsxYAOj5ASR1WMnBw
D/EGL_emulation( 2637): app_time_stats: avg=12.65ms min=3.00ms max=120.38ms count=50
D/EGL_emulation( 2637): app_time_stats: avg=4.20ms min=1.37ms max=8.33ms count=61
D/ProfileInstaller( 2637): Installing profile for com.example.vezigo
D/EGL_emulation( 2637): app_time_stats: avg=6.14ms min=1.10ms max=199.55ms count=57
Reloaded 1 of 1157 libraries in 243ms.
После перезагрузки

Код: Выделить всё

E/flutter ( 2637): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: TimeoutException after 0:00:30.000000: Future not completed
E/flutter ( 2637):
Restarted application in 617ms.
W/WindowOnBackDispatcher( 2637): sendCancelIfRunning: isInProgress=false callback=io.flutter.embedding.android.FlutterActivity$1@bf7ddac
I/flutter ( 2637): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmU3ZmEwMjliZGZlMTAwNmUzOTY0MzkiLCJpYXQiOjE3MjcxNzMyNTMsImV4cCI6MTc0Mjk0MTI1MywidHlwZSI6ImFjY2VzcyJ9.b0PWqexRxdiypAdbi8mdn14JQaYdLPerEryw3k1sVTU
I/flutter ( 2637): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmU3ZmEwMjliZGZlMTAwNmUzOTY0MzkiLCJpYXQiOjE3MjcxNzMyNTMsImV4cCI6MTc1ODcwOTI1MywidHlwZSI6InJlZnJlc2gifQ.xu95VDDLfimL0nAiMvM0ZD2R6REsxYAOj5ASR1WMnBw
D/EGL_emulation( 2637): app_time_stats: avg=61040.50ms min=1.08ms max=244092.02ms count=4
D/EGL_emulation( 2637): app_time_stats: avg=3.28ms min=0.89ms max=9.21ms count=61
D/EGL_emulation( 2637): app_time_stats: avg=2.55ms min=0.96ms max=6.38ms count=60
D/EGL_emulation( 2637): app_time_stats: avg=5.00ms min=1.14ms max=163.79ms count=59
флаттер-доктор

Код: Выделить всё

arleven@Arlevens-Mini vezigo-flutter % flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[!] Flutter (Channel stable, 3.24.1-0.0.pre.3, on macOS 14.6.1 23G93 darwin-arm64, locale en-IN)
! Upstream repository https://github.com/tanuu007/flutter.git is not a standard remote.
Set environment variable "FLUTTER_GIT_URL" to https://github.com/tanuu007/flutter.git to dismiss this error.
[!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
✗ Android license status unknown.
Run `flutter doctor --android-licenses` to accept the SDK licenses.
See https://flutter.dev/to/macos-android-setup for more details.
[✓] Xcode - develop for iOS and macOS (Xcode 15.4)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2024.1)
[✓] VS Code (version 1.93.1)
[✓] Connected device (5 available)
! Error: Browsing on the local area network for Arleven’s iPad. Ensure the device is unlocked and attached with a cable or associated with the same local area
network as this Mac.
The device must be opted into Developer Mode to connect wirelessly.  (code -27)
[✓] Network resources

! Doctor found issues in 2 categories.
А также мой домашний экран, на котором приложение вылетает в случае возникновения проблем

Код: Выделить всё

import 'package:flutter/material.dart';
import 'package:vezigo/Api_Models/banner.dart';
import 'package:vezigo/Screens/categories.dart';
import 'package:vezigo/Models/colors.dart';
import 'package:vezigo/Screens/cart_screen.dart';
import 'package:vezigo/Providers/item_provider.dart';
import 'package:provider/provider.dart';
import 'package:vezigo/Models/category.dart';
import 'dart:async';
import 'package:badges/badges.dart' as badges;
import 'package:http/http.dart' as http;
import 'package:vezigo/Screens/search.dart';
import 'dart:convert';
import '../Api_Models/list_products.dart';
import '../Providers/fav_provider.dart';
import 'item_details.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart';

class MyHomeScreen extends StatefulWidget {
const MyHomeScreen({super.key});

@override
State createState() => _MyHomeScreenState();
}
class _MyHomeScreenState extends State {
int _currentPage = 0;
final TextEditingController _searchController = TextEditingController();
final ScrollController _scrollController = ScrollController();
String _appBarTitle = 'Vezigo';
bool _isSearchVisible = false;
final PageController _pageController = PageController();
Timer? _timer;

@override
void initState() {
super.initState();
_futureProducts = fetchProducts();
_futureBanners = fetchbanner();
_scrollController.addListener(_scrollListener);
_timer = Timer.periodic(const Duration(seconds: 3), (Timer timer) {
if (_pageController.hasClients) {
if (_currentPage < 2) {
_currentPage++;
} else {
_currentPage = 0;
}
_pageController.animateToPage(
_currentPage,
duration: const Duration(milliseconds: 300),
curve: Curves.easeIn,
);
}
});

}
@override
void dispose() {
_scrollController.dispose();
_timer?.cancel();
_pageController.dispose();
super.dispose();
}
void _scrollListener() {
double offset = _scrollController.offset;
if (offset > 400) {
setState(() {
_appBarTitle = 'Fruits';
});
} else {
setState(() {
_appBarTitle = 'Vezigo';
});
}
}
Future fetchProducts() async {
final response = await http.get(Uri.parse('${AppColors.api}/products'));
if (response.statusCode == 200) {
final Map responseMap = json.decode(response.body);
final Map dataMap = responseMap['data'];
final List productList = dataMap['results'];
SharedPreferences prefs = await SharedPreferences.getInstance();
List productIds = productList.map((json) => Product.fromJson(json).id).toList();
await prefs.setStringList('productIds', productIds);
return productList.map((json) => Product.fromJson(json)).toList();
} else {
throw Exception('Failed to load products');
}
}

//Banner Api
Future fetchbanner() async{
final response = await http.get(Uri.parse('${AppColors.api}/app/banners'));
if(response.statusCode == 200){
final Map responseMap = json.decode(response.body);
final Map dataMap = responseMap['data'];
final List bannerData = dataMap['results'];
return bannerData.map((json) => BannerItem.fromJson(json)).toList();

} else {
throw Exception('Failed to load banners');
}
}
late Future _futureProducts;
late Future  _futureBanners;
@override
Widget build(BuildContext context) {
final favoriteProvider = Provider.of(context);
final cartProvider = Provider.of(context);
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
title: Text(
_appBarTitle,
style: const TextStyle(color: AppColors.textColor),
),
centerTitle: true,
backgroundColor: AppColors.appbarColor,
scrolledUnderElevation: 0,
leading: const SizedBox(width: 70),
actions: [
IconButton(
onPressed: () {
setState(() {
_isSearchVisible = !_isSearchVisible;
});
},
icon: const Icon(Icons.search, size: 30, color: AppColors.textColor),
),
badges.Badge(
position: badges.BadgePosition.topEnd(top: 0, end: 3),
badgeStyle:const badges.BadgeStyle(
badgeColor: Colors.white,
),
badgeAnimation: const badges.BadgeAnimation.fade(
animationDuration: Duration(milliseconds: 300),
),
showBadge: cartProvider.items.isNotEmpty,
badgeContent: Text(
cartProvider.items.length.toString(),
style: const TextStyle(color: Colors.black, fontSize: 12),
),
child: IconButton(
tooltip: 'cart',
icon: const Icon(Icons.shopping_cart, size: 30, color: AppColors.textColor),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => const CartScreen()),
);
},
),
),
],
),
body: Container(
width: double.infinity,
height: double.infinity,
decoration: const BoxDecoration(
color: AppColors.appbarColor,
),
child: SafeArea(
child: SingleChildScrollView(
controller: _scrollController,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Visibility(
visible: _isSearchVisible,
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 18.0, vertical: 10.0),
child: TextField(
readOnly: true,
onTap: ()async {
List productList = await _futureProducts;
Navigator.of(context).push(MaterialPageRoute(builder: (ctx) => SearchScreen(productList: productList)));
},
controller: _searchController,
decoration: InputDecoration(
filled: true,
fillColor: Colors.white,
labelText: 'Search Your Groceries',
suffixIcon: const Icon(Icons.search, color: AppColors.appbarColor),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(50),
),
),
),
),
),
FutureBuilder(
future: _futureBanners,
builder: (context, snapshot){
if(snapshot.connectionState == ConnectionState.waiting){
return Center(child: CircularProgressIndicator(),);
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
}else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(child: Text('No products available'));
} else {
final banners = snapshot.data!;
return AnimatedSize(
duration: const Duration(milliseconds: 300),
child: Container(
width: double.infinity,
decoration: BoxDecoration(
color: AppColors.backgroundColor,
borderRadius: BorderRadius.circular(0),
),
child: Padding(
padding: const EdgeInsets.only(top: 10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
height: MediaQuery.of(context).size.height * 0.2,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: const Color.fromARGB(255, 249, 255, 249),
),
child: PageView.builder(
controller: _pageController,
onPageChanged: (index) {
setState(() {
_currentPage = index;
});
},
itemCount: banners.length,
itemBuilder: (context, index) {
return GestureDetector(

onTap: () async {
final url = Uri.parse(banners[index].url);
if (await canLaunchUrl(url)) {
await launchUrl(url, mode: LaunchMode.externalApplication);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Could not launch $url')),
);
}
},
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: AppColors.lightTheme,
),
clipBehavior: Clip.hardEdge,
child: Image.network(
banners[index].image,
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,

),
),
);
},
),
),
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(banners.length, (index) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 4),
width: 10,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: _currentPage == index
? AppColors.buttonColor
: Colors.green.shade200,
),
);
}),
),

const   SizedBox(height: 10,),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Categories',
style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold),
),
),
Padding(
padding: const EdgeInsets.all(10.0),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CategoryItem(
title: 'Fruits',
imagePath: 'assets/images/orange.png',
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>const CategoriesScreen(
categoryTitle: 'fruit',
),
),
);
},
),
const SizedBox(width: 10),
CategoryItem(
title: 'Veggies',
imagePath: 'assets/images/veggies.png',
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>const CategoriesScreen(
categoryTitle:  'vegetable',
),
),
);
},
),
const SizedBox(width: 10),

],
),
),
),

const SizedBox(height: 20),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Popular',
style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold),
),
),

FutureBuilder(
future: _futureProducts,

builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(child: Text('No products available'));
} else {
final products = snapshot.data!;
return Padding(
padding: const EdgeInsets.all(8.0),
child: GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0,
childAspectRatio: 0.99,
),
itemCount: products.length,
itemBuilder: (context, index) {
final product = products[index];
final isFavorite = favoriteProvider.isFavorite(product);

return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>  ItemDetailsScreen(productId: product.id),
),
);
},
child: Card(
color: Colors.white,
elevation: 5,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: Colors.white,
width: 5,
),
),
child: Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
flex: 2,
child: ClipRRect(
borderRadius: const BorderRadius.vertical(top: Radius.circular(15)),
child: Container(
color: AppColors.lightTheme,
child: Image.network(
product.imageUrl,
fit: BoxFit.cover,
width: double.infinity,
),
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
product.title,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
RichText(
text: TextSpan(
children: [
TextSpan(
text: '₹${product.marketPrice}',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: AppColors.priceColor,
),
),

],
),
),
],
),
),
],
),
Positioned(
top: 8,
right: 8,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.lightTheme,
shape: const CircleBorder(),
),
child: Icon(
isFavorite ? Icons.favorite : Icons.favorite_border,
color: AppColors.buttonColor,
),
onPressed:  () {
favoriteProvider.toggleFavorite(product);
},
),
),
],
),
),
),
);
},
),
);
}
},
),

],
),
),
),
);
}}),
],
),
),
),
),
);
}
}

Кроме того, когда я запускаю команду flutter run, приложение работает правильно, а также все работает хорошо.
Пожалуйста, кто-нибудь может помочь, я застрял много дней назад


Подробнее здесь: https://stackoverflow.com/questions/790 ... oid-device
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»