alexrintt / shared-storage

Flutter plugin to work with Android external storage.
http://alexrintt.io/shared-storage/
MIT License
54 stars 26 forks source link

ANR may occur when used with apps that provide document providers #146

Open masiroyuki opened 1 year ago

masiroyuki commented 1 year ago

Describe the bug ANR may occur when accessing applications that provide network folders

To Reproduce

  1. install CIFS Documents Provider to use SMB

  2. Connect to SMB server with CIFS Documents Provider

  3. Open the demo application and get permission to access uri

  4. Turn off wifi (but leave LTE on)

  5. Execute canRead or exists

  6. UI freezes and ANR occurs

Expected behavior By separating threads in a coroutine Prevents the UI from freezing

Screenshots

https://github.com/alexrintt/shared-storage/assets/131235107/fd7ab062-4306-4169-8c76-036ac4575582

Desktop (please complete the following information):

Smartphone (please complete the following information):

Additional context

DemoApp
```dart import 'package:flutter/material.dart'; import 'package:shared_storage/shared_storage.dart' as saf; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { Uri? selectUri; String answer = ''; void openDocumentTree() => saf.openDocumentTree().then((value) { setState(() { selectUri = value; }); }); void canRead(Uri? uri) => saf.canRead(uri ?? Uri()).then((value) { setState(() { answer = value.toString(); }); }); void exists(Uri? uri) => saf.exists(uri ?? Uri()).then((value) { setState(() { answer = value.toString(); }); }); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'uri: ${selectUri.toString()}', style: Theme.of(context).textTheme.headlineLarge, ), Text( 'answer: $answer', style: Theme.of(context).textTheme.headlineLarge, ), const SizedBox(height: 200,), FilledButton( onPressed: () => openDocumentTree(), child: Text('openDocumentTree', style: Theme.of(context).textTheme.bodyMedium,)), FilledButton( onPressed: () => canRead(selectUri), child: Text('canRead', style: Theme.of(context).textTheme.bodyMedium,)), FilledButton( onPressed: () => exists(selectUri), child: Text('exists', style: Theme.of(context).textTheme.bodyMedium,)) ], ), ), ); } } ```