Сбой приложения при попытке инициализировать потоковую подписку

#dart #flutter

#dart #флаттер

Вопрос:

Я хочу постоянно отслеживать расстояние пользователя с помощью StreamSubscription , но каждый раз, когда приложение выходит из строя. Плагин, используемый для определения местоположения пользователя, является location . вот код.

 import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:location/location.dart';
import 'package:latlong/latlong.dart' as LatLong;

const LatLng defaultPosition = LatLng(0.906706, 123.259054);

class MapRoute extends StatefulWidget {
  final LatLng lokasiKegiatan;
  final double maxPerimeter;
  MapRoute(this.lokasiKegiatan, this.maxPerimeter);
  @override
  _MapRouteState createState() => _MapRouteState();
}

class _MapRouteState extends State<MapRoute> {
  Completer<GoogleMapController> mapController = Completer();
  bool isLoading = false;
  bool isUserNearby = false;
  bool isUserVisible = true;
  Location _locationManager = new Location();
  StreamSubscription<LocationData> _locationTrackerSub;
  LocationData _lokasiTerkini;
  String errorMessage;
  double distanceToLocation;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _locationTrackerSub = _locationManager.onLocationChanged().listen((data) {
      setState(() {
        _lokasiTerkini = data;
      });
    });
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _locationTrackerSub = null;

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    MarkerId markerId = MarkerId('ACARA PEMDA');
    Marker markerLokasi = new Marker(
        markerId: markerId,
        position: widget.lokasiKegiatan,
        infoWindow: InfoWindow(
          title: 'Apel Bersama',
          snippet: 'Apel Bersama PEMDA BOLMUT',
        ),
        icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed));
    final Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
    markers[markerId] = markerLokasi;
    return Column(
      mainAxisSize: MainAxisSize.max,
      children: <Widget>[
        Padding(
          padding: EdgeInsets.all(3.0),
          child: ClipRRect(
            borderRadius: BorderRadius.all(Radius.circular(30.0)),
            child: Column(
              children: <Widget>[
                SizedBox(
                  height: 400,
                  child: Stack(
                    children: <Widget>[
                      GoogleMap(
                        mapType: MapType.normal,
                        onMapCreated: _onMapCreated,
                        myLocationEnabled: isUserVisible,
                        initialCameraPosition: CameraPosition(
                          target: defaultPosition,
                          zoom: 15,
                        ),
                        markers: Set<Marker>.of(markers.values),
                      ),
                      Positioned(
                        top: 12,
                        left: 12,
                        child: SizedBox(
                          width: 39,
                          height: 37,
                          child: RaisedButton(
                            elevation: 1.0,
                            padding: EdgeInsets.all(2.0),
                            shape: RoundedRectangleBorder(
                              side: BorderSide(
                                width: 0.5,
                                color: Colors.white,
                              ),
                              borderRadius: BorderRadius.all(
                                Radius.circular(5.0),
                              ),
                            ),
                            child: Icon(
                              Icons.location_on,
                              color: Colors.black54,
                              size: 27,
                            ),
                            color: Colors.white,
                            onPressed: _goToLokasiKegiatan,
                          ),
                        ),
                      ),
                      Positioned(
                        top: 25,
                        left: 57,
                        child: distanceToLocation != null
                            ? Text('0 KM')
                            : Text(
                                'menghitung jarak ke lokasi kegiatan...',
                                style: ThemeData().textTheme.title,
                              ),
                      )
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
        SizedBox(
          height: 20.0,
        ),
        RaisedButton(
            color: Colors.blue,
            shape:
                CircleBorder(side: BorderSide(width: 1.0, color: Colors.amber)),
            elevation: 5,
            child: Icon(
              Icons.fingerprint,
              color: Colors.white,
              size: 74,
            ),
            onPressed: isUserNearby ? () {} : null)
      ],
    );
  }

  void _onMapCreated(GoogleMapController controller) async {
    mapController.complete(controller);
    _goToLokasiKegiatan();
  }

  void _goToLokasiKegiatan() async {
    mapController.future.then((controller) {
      controller.animateCamera(
        CameraUpdate.newCameraPosition(
          CameraPosition(target: widget.lokasiKegiatan, zoom: 18.0),
        ),
      );
    });
  }

  double calculateUserDistance(LocationData currentPosition) {
    //converting from gmap to latlong package
    var lat = widget.lokasiKegiatan.latitude;
    var long = widget.lokasiKegiatan.longitude;
    var ulat = currentPosition.latitude;
    var ulong = currentPosition.longitude;

    var jarak = LatLong.Distance();
    double meter = jarak.as(
      LatLong.LengthUnit.Meter,
      new LatLong.LatLng(lat, long),
      new LatLong.LatLng(ulat, ulong),
    );
    return meter;
  }

  void _processUserLocation(LocationData locationData) async {
    var distanceToLocation = calculateUserDistance(locationData);
    if (distanceToLocation <= widget.maxPerimeter) {
      setState(() {
        isUserNearby = true;
      });
    }
    setState(() {
      this.distanceToLocation = distanceToLocation;
    });
  }

  void _initLocation() async {
    LocationData location;
    try {
      if (await _locationManager.hasPermission()) {
        _locationTrackerSub = _locationManager.onLocationChanged().listen(
          (locationData) {
            setState(() {
              _lokasiTerkini = locationData;
            });
          },
        );
      }
    } catch (e) {
      debugPrint(e);
    }
  }
}
  

и вывод отладки..

 Launching libmain.dart on ASUS X00QD in debug mode...
Built buildappoutputsapkdebugapp-debug.apk.
I/SimplePermission(16555): Checking permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
Reloaded 2 of 449 libraries in 1,234ms.
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
Reloaded 2 of 449 libraries in 951ms.
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 2
I/SimplePermission(16555): Requesting permission : android.permission.ACCESS_FINE_LOCATION
I/SimplePermission(16555): Requesting permission status : 3
I/zzbz    (16555): Making Creator dynamically
W/mple.absensigp(16555): Unsupported class loader
W/mple.absensigp(16555): Skipping duplicate class check due to unsupported classloader
I/DynamiteModule(16555): Considering local module com.google.android.gms.maps_dynamite:0 and remote module com.google.android.gms.maps_dynamite:221
I/DynamiteModule(16555): Selected remote version of com.google.android.gms.maps_dynamite, version >= 221
V/DynamiteModule(16555): Dynamite loader version >= 2, using loadModule2NoCrashUtils
W/mple.absensigp(16555): Unsupported class loader
W/mple.absensigp(16555): Skipping duplicate class check due to unsupported classloader
I/Google Maps Android API(16555): Google Play services client version: 12451000
I/Google Maps Android API(16555): Google Play services package version: 15090039
W/mple.absensigp(16555): Accessing hidden field Ljava/nio/Buffer;->address:J (light greylist, reflection)
D/NetworkSecurityConfig(16555): No Network Security Config specified, using platform default
I/DpmTcmClient(16555): RegisterTcmMonitor from: com.android.okhttp.TcmIdleTimerMonitor
W/DynamiteModule(16555): Local module descriptor class for com.google.android.gms.googlecertificates not found.
I/DynamiteModule(16555): Considering local module com.google.android.gms.googlecertificates:0 and remote module com.google.android.gms.googlecertificates:4
I/DynamiteModule(16555): Selected remote version of com.google.android.gms.googlecertificates, version >= 4
W/mple.absensigp(16555): Unsupported class loader
W/mple.absensigp(16555): Skipping duplicate class check due to unsupported classloader
I/Adreno  (16555): DequeueBuffer: dequeueBuffer failed
I/Adreno  (16555): DequeueBuffer: dequeueBuffer failed
I/Adreno  (16555): DequeueBuffer: dequeueBuffer failed
W/OpenGLRenderer(16555): swapBuffers encountered EGL error 12301 on 0x75f6b20a00, halting rendering...
I/Google Maps Android API(16555): Google Play services package version: 15090039
W/System  (16555): A resource failed to call release. 
I/Google Maps Android API(16555): Google Play services package version: 15090039
I/Google Maps Android API(16555): Google Play services package version: 15090039
W/System  (16555): A resource failed to call release. 
W/System  (16555): A resource failed to call release. 
I/Google Maps Android API(16555): Google Play services package version: 15090039
W/System  (16555): A resource failed to call release. 
I/Google Maps Android API(16555): Google Play services package version: 15090039
I/mple.absensigp(16555): Compiler allocated 4MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
W/System  (16555): A resource failed to call release. 
Reloaded 3 of 449 libraries in 1,114ms.
I/Adreno  (16555): DequeueBuffer: dequeueBuffer failed
I/Adreno  (16555): DequeueBuffer: dequeueBuffer failed
I/Adreno  (16555): DequeueBuffer: dequeueBuffer failed
W/OpenGLRenderer(16555): swapBuffers encountered EGL error 12301 on 0x75ef08a900, halting rendering...
E/flutter (16555): [ERROR:flutter/shell/platform/android/platform_view_android_jni.cc(40)] java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/app/ActivityCompat;
E/flutter (16555):  at com.lyokone.location.LocationPlugin.checkPermissions(LocationPlugin.java:186)
E/flutter (16555):  at com.lyokone.location.LocationPlugin.onListen(LocationPlugin.java:271)
E/flutter (16555):  at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler.onListen(EventChannel.java:181)
E/flutter (16555):  at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler.onMessage(EventChannel.java:160)
E/flutter (16555):  at io.flutter.view.FlutterNativeView$PlatformMessageHandlerImpl.handleMessageFromDart(FlutterNativeView.java:188)
E/flutter (16555):  at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:202)
E/flutter (16555):  at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (16555):  at android.os.MessageQueue.next(MessageQueue.java:326)
E/flutter (16555):  at android.os.Looper.loop(Looper.java:163)
E/flutter (16555):  at android.app.ActivityThread.main(ActivityThread.java:6732)
E/flutter (16555):  at java.lang.reflect.Method.invoke(Native Method)
E/flutter (16555):  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/flutter (16555):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E/flutter (16555): Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.ActivityCompat" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64, /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/base.apk!/lib/arm64-v8a, /system/lib64]]
E/flutter (16555):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
E/flutter (16555):  at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
E/flutter (16555):  at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
E/flutter (16555):  ... 13 more
E/flutter (16555): 
F/flutter (16555): [FATAL:flutter/shell/platform/android/platform_view_android_jni.cc(77)] Check failed: CheckException(env). 
F/libc    (16555): Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 16555 (mple.absensigps), pid 16555 (mple.absensigps)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'asus/WW_X00QD/ASUS_X00QD:9/PPR1.180610.009/16.0611.1901.1-0:user/release-keys'
Revision: '0'
ABI: 'arm64'
pid: 16555, tid: 16555, name: mple.absensigps  >>> com.example.absensigps <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: '[FATAL:flutter/shell/platform/android/platform_view_android_jni.cc(77)] Check failed: CheckException(env). 
'
    x0  0000000000000000  x1  00000000000040ab  x2  0000000000000006  x3  0000000000000008
    x4  0000000000000000  x5  0000000000000000  x6  0000000000000000  x7  0000008000000000
    x8  0000000000000083  x9  afcf0ea64e096394  x10 0000000000000000  x11 fffffffc7ffffbdf
    x12 0000000000000001  x13 0000000000000018  x14 ffffffffffffffff  x15 0000f282b913c801
    x16 00000076978b02c8  x17 00000076977ee0d0  x18 0000000000000001  x19 00000000000040ab
    x20 00000000000040ab  x21 0000007fd63435b8  x22 00000000000000c3  x23 0000000000000099
    x24 00000075f8bbdfc0  x25 0000000000000050  x26 00000075eb83a6a0  x27 0000007612cf7c88
    x28 0000000000000034  x29 0000007fd63435a0
    sp  0000007fd6343560  lr  00000076977e2bfc  pc  00000076977e2c24
backtrace:
    #00 pc 0000000000021c24  /system/lib64/libc.so (abort 116)
    #01 pc 00000000006b7e48  /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64/libflutter.so (offset 0x690000)
    #02 pc 00000000006aca1c  /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64/libflutter.so (offset 0x690000)
    #03 pc 00000000006abc74  /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64/libflutter.so (offset 0x690000)
    #04 pc 00000000006e5018  /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64/libflutter.so (offset 0x690000)
    #05 pc 00000000006b9368  /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64/libflutter.so (offset 0x690000)
    #06 pc 00000000006baf58  /data/app/com.example.absensigps-vaz4urV31quLBNjs6K8-IA==/lib/arm64/libflutter.so (offset 0x690000)
    #07 pc 00000000000141c0  /system/lib64/libutils.so (android::Looper::pollInner(int) 856)
    #08 pc 0000000000013dcc  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**) 60)
    #09 pc 0000000000120a94  /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int) 44)
    #10 pc 00000000003e4fec  /system/framework/arm64/boot-framework.oat (offset 0x3d0000) (android.media.MediaExtractor.seekTo [DEDUPED] 140)
    #11 pc 000000000000284c  /dev/ashmem/dalvik-jit-code-cache (deleted) (android.os.MessageQueue.next 204)
    #12 pc 000000000006c8d4  /dev/ashmem/dalvik-jit-code-cache (deleted) (android.os.Looper.loop 404)
    #13 pc 0000000000554cdc  /system/lib64/libart.so (art_quick_osr_stub 44)
    #14 pc 0000000000306f9c  /system/lib64/libart.so (art::jit::Jit::MaybeDoOnStackReplacement(art::Thread*, art::ArtMethod*, unsigned int, int, art::JValue*) 1996)
    #15 pc 000000000052ad1c  /system/lib64/libart.so (MterpMaybeDoOnStackReplacement 144)
    #16 pc 000000000054b9f0  /system/lib64/libart.so (ExecuteMterpImpl 33136)
    #17 pc 0000000000b15512  /system/framework/boot-framework.vdex (android.os.Looper.loop 986)
    #18 pc 0000000000252fc0  /system/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.3783761849 488)
    #19 pc 0000000000258ab4  /system/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor constamp;, art::ShadowFrame*, art::JValue*) 216)
    #20 pc 00000000002792a0  /system/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrameamp;, art::Instruction const*, unsigned short, art::JValue*) 940)
    #21 pc 0000000000525c14  /system/lib64/libart.so (MterpInvokeStatic 204)
    #22 pc 0000000000547194  /system/lib64/libart.so (ExecuteMterpImpl 14612)
    #23 pc 00000000003919ec  /system/framework/boot-framework.vdex (android.app.ActivityThread.main 256)
    #24 pc 0000000000252fc0  /system/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.3783761849 488)
    #25 pc 0000000000514fa4  /system/lib64/libart.so (artQuickToInterpreterBridge 1020)
    #26 pc 000000000055dafc  /system/lib64/libart.so (art_quick_to_interpreter_bridge 92)
    #27 pc 0000000000554c4c  /system/lib64/libart.so (art_quick_invoke_static_stub 604)
    #28 pc 00000000000cf6e8  /system/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) 232)
    #29 pc 000000000045c840  /system/lib64/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable constamp;, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*) 104)
    #30 pc 000000000045e294  /system/lib64/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable constamp;, _jobject*, _jobject*, _jobject*, unsigned long) 1440)
    #31 pc 00000000003ee1d4  /system/lib64/libart.so (art::Method_invoke(_JNIEnv*, _jobject*, _jobject*, _jobjectArray*) 52)
    #32 pc 000000000011e6d4  /system/framework/arm64/boot-core-oj.oat (offset 0x114000) (java.lang.Class.getDeclaredMethodInternal [DEDUPED] 180)
    #33 pc 0000000000554988  /system/lib64/libart.so (art_quick_invoke_stub 584)
    #34 pc 00000000000cf6c8  /system/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) 200)
    #35 pc 000000000027f2b4  /system/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*) 344)
    #36 pc 00000000002792bc  /system/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrameamp;, art::Instruction const*, unsigned short, art::JValue*) 968)
    #37 pc 0000000000524710  /system/lib64/libart.so (MterpInvokeVirtual 588)
    #38 pc 0000000000547014  /system/lib64/libart.so (ExecuteMterpImpl 14228)
    #39 pc 0000000000c3779e  /system/framework/boot-framework.vdex (com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run 22)
    #40 pc 0000000000252fc0  /system/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.3783761849 488)
    #41 pc 0000000000514fa4  /system/lib64/libart.so (artQuickToInterpreterBridge 1020)
    #42 pc 000000000055dafc  /system/lib64/libart.so (art_quick_to_interpreter_bridge 92)
    #43 pc 0000000000bf9920  /system/framework/arm64/boot-framework.oat (offset 0x3d0000) (com.android.internal.os.ZygoteInit.main 3088)
    #44 pc 0000000000554c4c  /system/lib64/libart.so (art_quick_invoke_static_stub 604)
    #45 pc 00000000000cf6e8  /system/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) 232)
    #46 pc 000000000045c840  /system/lib64/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable constamp;, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*) 104)
    #47 pc 000000000045c4a0  /system/lib64/libart.so (art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable constamp;, _jobject*, _jmethodID*, std::__va_list) 424)
    #48 pc 0000000000361b60  /system/lib64/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, std::__va_list) 652)
    #49 pc 00000000000b2e24  /system/lib64/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...) 120)
    #50 pc 00000000000b57a8  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vector<android::String8> constamp;, bool) 756)
    #51 pc 00000000000022f8  /system/bin/app_process64 (main 1380)
    #52 pc 00000000000aca4c  /system/lib64/libc.so (__libc_init 88)
Lost connection to device.
Exited (sigterm)
  

Спасибо за помощь новичку..