Я делаю приложение Geography Trivia с Flutter, которое использует Cloud Firestore для хранения пользовательских викторинов. Я получаю много ошибок, когда бы мое приложение существует на главном экране. Эта же ошибка печатается неоднократно, около раз в секунду. Якобы приложение пытается подключиться к чему -то, но терпит неудачу. Тем не менее, аспекты подключения к Интернету, по -видимому, работают довольно хорошо (я проверил Firestore, и все значения обновляются, когда они должны быть). Эти ошибки имеют значение? И если нет, есть ли способ остановить их от засорения моей отладки?E/AndroidRuntime(13222): FATAL EXCEPTION: main
E/AndroidRuntime(13222): Process: com.google.android.gms.persistent, PID: 13222
E/AndroidRuntime(13222): java.lang.RuntimeException: Unable to bind to service com.google.android.gms.gcm.PushMessagingRegistrarProxy@6771f8e with Intent { act=com.google.android.c2dm.intent.REGISTER pkg=com.google.android.gms }: java.lang.IllegalArgumentException: NetworkCapability 37 out of range
E/AndroidRuntime(13222): at android.app.ActivityThread.handleBindService(ActivityThread.java:5021)
E/AndroidRuntime(13222): at android.app.ActivityThread.-$$Nest$mhandleBindService(Unknown Source:0)
E/AndroidRuntime(13222): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2451)
E/AndroidRuntime(13222): at android.os.Handler.dispatchMessage(Handler.java:107)
E/AndroidRuntime(13222): at android.os.Looper.loopOnce(Looper.java:232)
E/AndroidRuntime(13222): at android.os.Looper.loop(Looper.java:317)
E/AndroidRuntime(13222): at android.app.ActivityThread.main(ActivityThread.java:8699)
E/AndroidRuntime(13222): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(13222): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
E/AndroidRuntime(13222): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
E/AndroidRuntime(13222): Caused by: java.lang.IllegalArgumentException: NetworkCapability 37 out of range
E/AndroidRuntime(13222): at android.net.NetworkCapabilities.checkValidCapability(NetworkCapabilities.java:2637)
E/AndroidRuntime(13222): at android.net.NetworkCapabilities.removeCapability(NetworkCapabilities.java:881)
E/AndroidRuntime(13222): at android.net.NetworkRequest$Builder.removeCapability(NetworkRequest.java:360)
E/AndroidRuntime(13222): at bjni.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):96)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at bjgg.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):11)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at bjii.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):35)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at dagger.internal.DelegateFactory.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):5)
E/AndroidRuntime(13222): at bjbr.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):41)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at bjbp.b(:com.google.android.gms@250832038@25.08.32 (260800-731361394):70)
E/AndroidRuntime(13222): at com.google.android.gms.gcm.registration.PushMessagingRegistrarChimeraProxy.onBind(:com.google.android.gms@250832038@25.08.32 (260800-731361394):13)
E/AndroidRuntime(13222): at aolo.onBind(:com.google.android.gms@250832038@25.08.32 (260800-731361394):39)
E/AndroidRuntime(13222): at android.app.ActivityThread.handleBindService(ActivityThread.java:5006)
E/AndroidRuntime(13222): ... 9 more
< /code>
Вот мой основной экран: < /p>
import 'package:flutter/material.dart';
import 'package:geography_trivia_app/screens/welcome/home_screen.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:geography_trivia_app/screens/welcome/initial_authentication_screen.dart';
import 'package:get/get.dart';
import 'controllers/player_data_controller.dart';
import 'firebase_options.dart';
bool currentDeviceExists = false;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
PlayerDataController playerDataController = Get.put(PlayerDataController()) ?? Get.find
();
await playerDataController.findDeviceID();
currentDeviceExists = await playerDataController.deviceExists();
//make a public leaderboardSize variable?
await playerDataController.findTopPlayers(10);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
double width = size.width;
double height = size.height;
return GetMaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(scaffoldBackgroundColor: const Color.fromRGBO(255, 255, 248, 1)),
home: const HomeController(),
);
}
}
class HomeController extends StatelessWidget {
const HomeController({super.key});
@override
Widget build(BuildContext context) {
return currentDeviceExists ? HomeScreen() : NameScreen();
}
}
< /code>
Вот главный экран (мне не нужно нажимать на кнопки, чтобы бросить ошибку), поэтому ни один из других экранов имеет значение): < /p>
import 'package:flutter/material.dart';
import 'package:geography_trivia_app/screens/leaderboard_screen.dart';
import 'package:geography_trivia_app/screens/settings_screen.dart';
import 'package:geography_trivia_app/screens/welcome/category_selection_screen.dart';
import 'package:get/get.dart';
import 'package:geography_trivia_app/controllers/ui_components.dart';
double dividerHeight = 35;
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
//local variables go here i thinks
var size = MediaQuery.of(context).size;
double width = size.width;
double height = size.height;
return Scaffold(
body: Padding(
padding: EdgeInsets.fromLTRB(width * 0.07, height * 0.1, width * 0.07, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(
child: headerText(context, 'International IQ', 45.0)
),
Center(
child: Padding(
padding: EdgeInsets.fromLTRB(0, height * 0.05, 0, height * 0.05),
child: Transform(
//transform measures things in radians for some godforsaken reason
transform: Matrix4.rotationZ(-3.1415926535897932 / 8),
alignment: FractionalOffset.center,
child: const CircleAvatar(
backgroundImage: AssetImage('assets/originalAssets/globe.png'),
radius: 120.0,
))),
),
Center(
child: SizedBox(
width: width * 0.8,
height: height * 0.35,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
longButton(context, 'PLAY', () {
print(height);
Get.to(() => CategorySelectionScreen());
}),
longButton(context, 'SETTINGS', () {
Get.to(() => SettingsScreen());
}),
longButton(context, 'LEADERBOARD', () {
Get.to(() => LeaderboardScreen());
}),
],
),
),
),
],
),
),
);
}
}
< /code>
И, наконец, вот контроллер данных игрока. < /p>
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'dart:io';
import 'package:get_storage/get_storage.dart';
class PlayerDataController extends GetxController with GetSingleTickerProviderStateMixin {
FirebaseFirestore playerDatabase = FirebaseFirestore.instance;
String? deviceID;
String? playerName;
String? playerRegion;
RxInt playerScoreTotal = 0.obs;
List topPlayersList = [];
@override
void onInit() {
if(GetStorage().hasData("totalScore")) {
playerScoreTotal = GetStorage().read("totalScore");
}
ever(playerScoreTotal, (_) {
GetStorage().write('totalScore', playerScoreTotal.value);
});
super.onInit();
}
Future addUser() async {
// Create a new user with a first and last name
var user = {
"Name": playerName ?? "no name detected",
"Region": playerRegion ?? "no region detected",
"Score": playerScoreTotal.value,
"DeviceID": await findDeviceID(),
};
playerDatabase.collection("users").doc("$deviceID").set(user);
}
Future findDeviceID() async {
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
try {
if (Platform.isAndroid) {
var build = await deviceInfoPlugin.androidInfo;
deviceID = build.id;
return build.id; //UUID for Android
} else if (Platform.isIOS) {
var data = await deviceInfoPlugin.iosInfo;
deviceID = data.identifierForVendor.toString();
return data.identifierForVendor.toString(); //UUID for iOS
}
} catch (e) {
}
return "no ID detected";
}
Future deviceExists() async {
bool exists = false;
var doc = await playerDatabase.collection("users").doc(deviceID).get();
exists = doc.exists;
if (exists) {
Map data = doc.data()!;
playerName = data["Name"];
playerScoreTotal.value = data["Score"];
playerRegion = data["Region"];
}
return exists;
}
void setPlayerName(String name) {
playerName = name;
}
void setPlayerRegion(String region) {
playerRegion = region;
}
Future addToPlayerScore(int score) async {
playerScoreTotal += score;
final data = {"Score": playerScoreTotal.value};
playerDatabase.collection("users").doc(deviceID).set(data, SetOptions(merge: true));
}
void resetScore() {
playerScoreTotal = 0.obs;
GetStorage().write('totalScore', 0);
final data = {"Score": 0};
playerDatabase.collection("users").doc(deviceID).set(data, SetOptions(merge: true));
}
Future findTopPlayers(int numOfPlayers) async {
final docRef = playerDatabase.collection("users");
await docRef.orderBy("Score", descending: true).limit(numOfPlayers).get().then(
(querySnapshot) {
topPlayersList.clear();
for (var docSnapshot in querySnapshot.docs) {
//.data() is a map of data
topPlayersList.add(docSnapshot.data());
}
}
);
}
}
< /code>
Честно говоря, я в основном обеспокоен тем, что за кулисами я даже не знаю. Но хм, большое спасибо заранее.
Подробнее здесь: https://stackoverflow.com/questions/795 ... connecting
Почему Флаттер говорит «не может привязать к обслуживанию», когда он, кажется, подключается к Интернету просто отлично? ⇐ Android
Форум для тех, кто программирует под Android
1755705952
Anonymous
Я делаю приложение Geography Trivia с Flutter, которое использует Cloud Firestore для хранения пользовательских викторинов. Я получаю много ошибок, когда бы мое приложение существует на главном экране. Эта же ошибка печатается неоднократно, около раз в секунду. Якобы приложение пытается подключиться к чему -то, но терпит неудачу. Тем не менее, аспекты подключения к Интернету, по -видимому, работают довольно хорошо (я проверил Firestore, и все значения обновляются, когда они должны быть). Эти ошибки имеют значение? И если нет, есть ли способ остановить их от засорения моей отладки?E/AndroidRuntime(13222): FATAL EXCEPTION: main
E/AndroidRuntime(13222): Process: com.google.android.gms.persistent, PID: 13222
E/AndroidRuntime(13222): java.lang.RuntimeException: Unable to bind to service com.google.android.gms.gcm.PushMessagingRegistrarProxy@6771f8e with Intent { act=com.google.android.c2dm.intent.REGISTER pkg=com.google.android.gms }: java.lang.IllegalArgumentException: NetworkCapability 37 out of range
E/AndroidRuntime(13222): at android.app.ActivityThread.handleBindService(ActivityThread.java:5021)
E/AndroidRuntime(13222): at android.app.ActivityThread.-$$Nest$mhandleBindService(Unknown Source:0)
E/AndroidRuntime(13222): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2451)
E/AndroidRuntime(13222): at android.os.Handler.dispatchMessage(Handler.java:107)
E/AndroidRuntime(13222): at android.os.Looper.loopOnce(Looper.java:232)
E/AndroidRuntime(13222): at android.os.Looper.loop(Looper.java:317)
E/AndroidRuntime(13222): at android.app.ActivityThread.main(ActivityThread.java:8699)
E/AndroidRuntime(13222): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(13222): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
E/AndroidRuntime(13222): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
E/AndroidRuntime(13222): Caused by: java.lang.IllegalArgumentException: NetworkCapability 37 out of range
E/AndroidRuntime(13222): at android.net.NetworkCapabilities.checkValidCapability(NetworkCapabilities.java:2637)
E/AndroidRuntime(13222): at android.net.NetworkCapabilities.removeCapability(NetworkCapabilities.java:881)
E/AndroidRuntime(13222): at android.net.NetworkRequest$Builder.removeCapability(NetworkRequest.java:360)
E/AndroidRuntime(13222): at bjni.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):96)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at bjgg.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):11)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at bjii.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):35)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at dagger.internal.DelegateFactory.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):5)
E/AndroidRuntime(13222): at bjbr.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):41)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.c(:com.google.android.gms@250832038@25.08.32 (260800-731361394):10)
E/AndroidRuntime(13222): at dagger.internal.DoubleCheck.get(:com.google.android.gms@250832038@25.08.32 (260800-731361394):7)
E/AndroidRuntime(13222): at bjbp.b(:com.google.android.gms@250832038@25.08.32 (260800-731361394):70)
E/AndroidRuntime(13222): at com.google.android.gms.gcm.registration.PushMessagingRegistrarChimeraProxy.onBind(:com.google.android.gms@250832038@25.08.32 (260800-731361394):13)
E/AndroidRuntime(13222): at aolo.onBind(:com.google.android.gms@250832038@25.08.32 (260800-731361394):39)
E/AndroidRuntime(13222): at android.app.ActivityThread.handleBindService(ActivityThread.java:5006)
E/AndroidRuntime(13222): ... 9 more
< /code>
Вот мой основной экран: < /p>
import 'package:flutter/material.dart';
import 'package:geography_trivia_app/screens/welcome/home_screen.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:geography_trivia_app/screens/welcome/initial_authentication_screen.dart';
import 'package:get/get.dart';
import 'controllers/player_data_controller.dart';
import 'firebase_options.dart';
bool currentDeviceExists = false;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
PlayerDataController playerDataController = Get.put(PlayerDataController()) ?? Get.find
();
await playerDataController.findDeviceID();
currentDeviceExists = await playerDataController.deviceExists();
//make a public leaderboardSize variable?
await playerDataController.findTopPlayers(10);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
double width = size.width;
double height = size.height;
return GetMaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(scaffoldBackgroundColor: const Color.fromRGBO(255, 255, 248, 1)),
home: const HomeController(),
);
}
}
class HomeController extends StatelessWidget {
const HomeController({super.key});
@override
Widget build(BuildContext context) {
return currentDeviceExists ? HomeScreen() : NameScreen();
}
}
< /code>
Вот главный экран (мне не нужно нажимать на кнопки, чтобы бросить ошибку), поэтому ни один из других экранов имеет значение): < /p>
import 'package:flutter/material.dart';
import 'package:geography_trivia_app/screens/leaderboard_screen.dart';
import 'package:geography_trivia_app/screens/settings_screen.dart';
import 'package:geography_trivia_app/screens/welcome/category_selection_screen.dart';
import 'package:get/get.dart';
import 'package:geography_trivia_app/controllers/ui_components.dart';
double dividerHeight = 35;
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
//local variables go here i thinks
var size = MediaQuery.of(context).size;
double width = size.width;
double height = size.height;
return Scaffold(
body: Padding(
padding: EdgeInsets.fromLTRB(width * 0.07, height * 0.1, width * 0.07, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(
child: headerText(context, 'International IQ', 45.0)
),
Center(
child: Padding(
padding: EdgeInsets.fromLTRB(0, height * 0.05, 0, height * 0.05),
child: Transform(
//transform measures things in radians for some godforsaken reason
transform: Matrix4.rotationZ(-3.1415926535897932 / 8),
alignment: FractionalOffset.center,
child: const CircleAvatar(
backgroundImage: AssetImage('assets/originalAssets/globe.png'),
radius: 120.0,
))),
),
Center(
child: SizedBox(
width: width * 0.8,
height: height * 0.35,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
longButton(context, 'PLAY', () {
print(height);
Get.to(() => CategorySelectionScreen());
}),
longButton(context, 'SETTINGS', () {
Get.to(() => SettingsScreen());
}),
longButton(context, 'LEADERBOARD', () {
Get.to(() => LeaderboardScreen());
}),
],
),
),
),
],
),
),
);
}
}
< /code>
И, наконец, вот контроллер данных игрока. < /p>
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'dart:io';
import 'package:get_storage/get_storage.dart';
class PlayerDataController extends GetxController with GetSingleTickerProviderStateMixin {
FirebaseFirestore playerDatabase = FirebaseFirestore.instance;
String? deviceID;
String? playerName;
String? playerRegion;
RxInt playerScoreTotal = 0.obs;
List topPlayersList = [];
@override
void onInit() {
if(GetStorage().hasData("totalScore")) {
playerScoreTotal = GetStorage().read("totalScore");
}
ever(playerScoreTotal, (_) {
GetStorage().write('totalScore', playerScoreTotal.value);
});
super.onInit();
}
Future addUser() async {
// Create a new user with a first and last name
var user = {
"Name": playerName ?? "no name detected",
"Region": playerRegion ?? "no region detected",
"Score": playerScoreTotal.value,
"DeviceID": await findDeviceID(),
};
playerDatabase.collection("users").doc("$deviceID").set(user);
}
Future findDeviceID() async {
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
try {
if (Platform.isAndroid) {
var build = await deviceInfoPlugin.androidInfo;
deviceID = build.id;
return build.id; //UUID for Android
} else if (Platform.isIOS) {
var data = await deviceInfoPlugin.iosInfo;
deviceID = data.identifierForVendor.toString();
return data.identifierForVendor.toString(); //UUID for iOS
}
} catch (e) {
}
return "no ID detected";
}
Future deviceExists() async {
bool exists = false;
var doc = await playerDatabase.collection("users").doc(deviceID).get();
exists = doc.exists;
if (exists) {
Map data = doc.data()!;
playerName = data["Name"];
playerScoreTotal.value = data["Score"];
playerRegion = data["Region"];
}
return exists;
}
void setPlayerName(String name) {
playerName = name;
}
void setPlayerRegion(String region) {
playerRegion = region;
}
Future addToPlayerScore(int score) async {
playerScoreTotal += score;
final data = {"Score": playerScoreTotal.value};
playerDatabase.collection("users").doc(deviceID).set(data, SetOptions(merge: true));
}
void resetScore() {
playerScoreTotal = 0.obs;
GetStorage().write('totalScore', 0);
final data = {"Score": 0};
playerDatabase.collection("users").doc(deviceID).set(data, SetOptions(merge: true));
}
Future findTopPlayers(int numOfPlayers) async {
final docRef = playerDatabase.collection("users");
await docRef.orderBy("Score", descending: true).limit(numOfPlayers).get().then(
(querySnapshot) {
topPlayersList.clear();
for (var docSnapshot in querySnapshot.docs) {
//.data() is a map of data
topPlayersList.add(docSnapshot.data());
}
}
);
}
}
< /code>
Честно говоря, я в основном обеспокоен тем, что за кулисами я даже не знаю. Но хм, большое спасибо заранее.
Подробнее здесь: [url]https://stackoverflow.com/questions/79535561/why-does-flutter-say-unable-to-bind-to-service-when-it-seems-to-be-connecting[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия