Anonymous
Приложение Flutter аварийно завершает работу только на устройстве Android
Сообщение
Anonymous » 27 сен 2024, 14:56
Мне действительно нужна помощь в этом. Я пробую это уже много дней и до сих пор не могу понять проблему.
Когда я запускаю это приложение в симуляторе 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
1727438174
Anonymous
Мне действительно нужна помощь в этом. Я пробую это уже много дней и до сих пор не могу понять проблему. Когда я запускаю это приложение в симуляторе iOS, оно работает нормально, но когда я запускаю его на любом устройстве Android, оно работает вылетает сразу. Я не вижу проблемы. Моя консоль отладки после запуска приложения дает сбой [code]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. [/code] После перезагрузки [code]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 [/code] флаттер-доктор [code]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. [/code] А также мой домашний экран, на котором приложение вылетает в случае возникновения проблем [code]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); }, ), ), ], ), ), ), ); }, ), ); } }, ), ], ), ), ), ); }}), ], ), ), ), ), ); } } [/code] Кроме того, когда я запускаю команду flutter run, приложение работает правильно, а также все работает хорошо. Пожалуйста, кто-нибудь может помочь, я застрял много дней назад Подробнее здесь: [url]https://stackoverflow.com/questions/79031190/flutter-app-crashing-in-only-android-device[/url]