After updating some Linux Mint 22.2 packages (I forget which packages) I no longer able to run my Flutter app correctly because of these errors:
Package path_provider:linux references path_provider_linux:linux as the default plugin, but the package does not exist, or is not a plugin package.
Ask the maintainers of path_provider to either avoid referencing a default implementation via `platforms: linux: default_package: path_provider_linux` or create a plugin named
path_provider_linux.
Package shared_preferences:linux references shared_preferences_linux:linux as the default plugin, but the package does not exist, or is not a plugin package.
Ask the maintainers of shared_preferences to either avoid referencing a default implementation via `platforms: linux: default_package: shared_preferences_linux` or create a plugin named
shared_preferences_linux.
Package url_launcher:linux references url_launcher_linux:linux as the default plugin, but the package does not exist, or is not a plugin package.
Ask the maintainers of url_launcher to either avoid referencing a default implementation via `platforms: linux: default_package: url_launcher_linux` or create a plugin named
url_launcher_linux.
How can I fix this issue?
I tried these but failed to solve this issue!
- Reboot Linux
- Made a deep clean for Flutter project:
flutter clean
rm -rf android .gradle build linux ios pubspec.lock .dart_tool
flutter create --platforms android .
flutter create --platforms linux .
flutter create --platforms ios .
flutter pub get
- Reinstalled
libgtk-3-dev
sudo apt remove --purge libgtk-3-dev
sudo apt install libgtk-3-dev
pubspec.yaml
name: test_linux_and
description: "A new Flutter project."
publish_to: 'none'
version: 0.1.0
environment:
sdk: ^3.9.2
dependencies:
flutter:
sdk: flutter
path_provider: ^2.1.5
shared_preferences: ^2.4.1
url_launcher: ^6.3.2
dev_dependencies:
flutter_lints: ^5.0.0
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
main.dart
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart';
import 'dart:io';
void main() {
runApp(const MainApp());
}
class MainApp extends StatelessWidget {
const MainApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Flutter Packages Demo')),
body: const PackageDemoScreen(),
),
);
}
}
class PackageDemoScreen extends StatefulWidget {
const PackageDemoScreen({super.key});
@override
State<PackageDemoScreen> createState() => _PackageDemoScreenState();
}
class _PackageDemoScreenState extends State<PackageDemoScreen> {
String _filePath = 'No path yet';
String _preferenceValue = 'No value yet';
String _errorMessage = '';
bool _isLoading = false;
final TextEditingController _preferenceController = TextEditingController();
final TextEditingController _urlController = TextEditingController(
text: 'https://flutter.dev',
);
@override
void initState() {
super.initState();
_loadPreference();
}
Future<void> _getTempDirectory() async {
setState(() {
_isLoading = true;
_errorMessage = '';
});
try {
final Directory tempDir = await getTemporaryDirectory();
setState(() {
_filePath = tempDir.path;
});
} catch (e) {
setState(() {
_errorMessage = 'Path Provider Error: $e';
});
// Log error to console
print('Path Provider Error: $e');
} finally {
setState(() {
_isLoading = false;
});
}
}
Future<void> _savePreference() async {
if (_preferenceController.text.isEmpty) return;
setState(() {
_isLoading = true;
_errorMessage = '';
});
try {
final SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('demo_key', _preferenceController.text);
setState(() {
_preferenceValue = _preferenceController.text;
});
_preferenceController.clear();
} catch (e) {
setState(() {
_errorMessage = 'Shared Preferences Error: $e';
});
// Log error to console
print('Shared Preferences Error: $e');
} finally {
setState(() {
_isLoading = false;
});
}
}
Future<void> _loadPreference() async {
try {
final SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_preferenceValue = prefs.getString('demo_key') ?? 'No value yet';
});
} catch (e) {
setState(() {
_errorMessage = 'Error loading preference: $e';
});
// Log error to console
print('Error loading preference: $e');
}
}
Future<void> _launchUrl() async {
if (_urlController.text.isEmpty) return;
setState(() {
_errorMessage = '';
});
try {
final Uri url = Uri.parse(_urlController.text);
if (!await launchUrl(url, mode: LaunchMode.externalApplication)) {
setState(() {
_errorMessage = 'Could not launch URL';
});
// Log error to console
print('Could not launch URL: ${_urlController.text}');
}
} catch (e) {
setState(() {
_errorMessage = 'URL Launcher Error: $e';
});
// Log error to console
print('URL Launcher Error: $e');
}
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (_errorMessage.isNotEmpty)
Container(
padding: const EdgeInsets.all(8),
color: Colors.red[100],
child: Text(
_errorMessage,
style: const TextStyle(color: Colors.red),
),
),
const Text(
'path_provider:',
style: TextStyle(fontWeight: FontWeight.bold),
),
Text('Path: $_filePath'),
ElevatedButton(
onPressed: _isLoading ? null : _getTempDirectory,
child: const Text('Get Temp Directory'),
),
const Divider(),
const Text(
'shared_preferences:',
style: TextStyle(fontWeight: FontWeight.bold),
),
Text('Stored: $_preferenceValue'),
TextField(
controller: _preferenceController,
decoration: const InputDecoration(hintText: 'Enter value'),
),
ElevatedButton(
onPressed: _isLoading ? null : _savePreference,
child: const Text('Save Value'),
),
const Divider(),
const Text(
'url_launcher:',
style: TextStyle(fontWeight: FontWeight.bold),
),
TextField(
controller: _urlController,
decoration: const InputDecoration(hintText: 'Enter URL'),
),
ElevatedButton(
onPressed: _isLoading ? null : _launchUrl,
child: const Text('Launch URL'),
),
],
),
),
if (_isLoading) const Center(child: CircularProgressIndicator()),
],
);
}
@override
void dispose() {
_preferenceController.dispose();
_urlController.dispose();
super.dispose();
}
}