Missing Linux implementations for path_provider, shared_preferences, and url_launcher [SOLVED]

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!

  1. Reboot Linux
  2. 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
  1. 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();
  }
}

After tons of fixes I could fix it by deleting “pub-cache” then everything went fine

1 Like