Provider: τι είναι, διαχειριστής κατάστασης εφαρμογών Flutter

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-19 Χρόνος ανάγνωσης: 7 λεπ

Provider — πακέτο διαχείρισης κατάστασης για Flutter, δημιουργημένο από τον Rémi Rousselet το 2019 ως ένα περιτύλιγμα πάνω από το InheritedWidget. Το Provider λύνει το πρόβλημα μεταφοράς δεδομένων προς τα κάτω στο δένδρο widget χωρίς props drilling: οποιοδήποτε widget έχει πρόσβαση στην κατάσταση μέσω context.read<T>() ή context.watch<T>(). Σύμφωνα με το pub.dev, το Provider είναι ο δημοφιλέστερος διαχειριστής κατάστασης Flutter με πάνω από 25 χιλιάδες likes.

Κύρια Σημεία

  • ChangeNotifier — κλάση με notifyListeners για ειδοποίηση των συνδρομητών για αλλαγή
  • Consumer — widget που ανακατασκευάζεται όταν αλλάζει το ChangeNotifier
  • MultiProvider — σύνθεση πολλών Provider χωρίς φωλιάσματα
  • ProxyProvider — Provider που εξαρτάται από άλλο Provider
  • context.read / context.watch — μέθοδοι ανάγνωσης κατάστασης χωρίς και με συνδρομή

Τι είναι το Provider;

Provider — πακέτο για διαχείριση κατάστασης και ενετοπισμό εξαρτήσεων στο Flutter, κατασκευασμένο πάνω στο InheritedWidget. Το Provider κάνει ενα αντικείμενο (κατάσταση, υπηρεσία, αποθηκη) διαθέσιμο στο δένδρο widget και αυτόματα ανακατασκευάζει το UI όταν αλλάζουν τα δεδομένα.

Το Provider είναι επίσημα συνιστώμενο από τη Google για διαχείριση κατάστασης στο Flutter (Flutter Team, 2019-2023). Σύμφωνα με την Flutter Community Survey 2025, το Provider χρησιμοποιείται σε 72% των εφαρμογών Flutter.

ChangeNotifier κι notifyListeners

ChangeNotifier — ενσωματωμένη κλάση Flutter που υλοποιεί το πρότυπο Listener. Ειδοποιεί τους συνδρομητές μέσω της κλήσης notifyListeners().

Dart
class CounterProvider extends ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void reset() {
    _count = 0;
    notifyListeners();
  }
}

Κανόνες notifyListeners: καλείτε μετά από πλήρη αλλαγή δεδομένων — όχι στη μέση της μεθόδου, αλλά στο τέλος.

Consumer και context.watch

Consumer — widget που εγγράφεται στο ChangeNotifier και ανακατασκευάζεται σε κάθε κλήση notifyListeners().

Dart
Consumer<CounterProvider>(
  builder: (context, provider, child) => Column(
    children: [
      child!, // δεν ανακατασκευάζεται
      Text('${provider.count}'),
      ElevatedButton(
        onPressed: () => provider.increment(),
        child: Icon(Icons.add),
      ),
    ],
  ),
  child: Text('Αριθμητής:'),
)

context.watch — μέθοδος επέκτασης BuildContext για εγγραφή σε Provider. context.read — πρόσβαση χωρίς συνδρομή. context.select — εγγραφή σε συγκεκριμένο πεδίο του μοντέλου.

MultiProvider και ProxyProvider

MultiProvider — widget για εγγραφή πολλών Provider χωρίς φωλιάσματα. ProxyProvider — Provider που εξαρτάται από άλλο Provider.

Dart
MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => CartProvider()),
    ChangeNotifierProvider(create: (_) => AuthProvider()),
    ProxyProvider<AuthProvider, OrderProvider>(
      update: (_, auth, __) => OrderProvider(auth.userId),
    ),
  ],
  child: MaterialApp(home: HomePage()),
)

Δοκιμή του Provider

Το Provider δοκιμάζεται τυλίγοντας το widget σε MultiProvider με τιμές δοκιμής.

Dart
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('Counter increments on button tap',
    (tester) async {
      await tester.pumpWidget(
        ChangeNotifierProvider(
          create: (_) => CounterProvider(),
          child: CounterScreen(),
        ),
      );
      await tester.tap(find.byKey(Key('increment')));
      await tester.pump();
      expect(find.text('1'), findsOneWidget);
    },
  );
}

Provider: απόδοση και περιορισμοί

Η απόδοση του Provider βασίζεται στο InheritedWidget: όταν αλλάζει το Provider, όλα τα widget που έχουν εγγραφεί μέσω context.watch ή Consumer ανακατασκευάζονται.

ΜέθοδοςΣυνδρομήΑνακατασκευήΧρήση
context.watchΠλήρες μοντέλοΚάθε αλλαγήΑπλά widget
ConsumerΠλήρες μοντέλοΚάθε αλλαγήΜε child βελτιστοποίηση
context.selectΣυγκεκριμένο πεδίοΜόνο όταν αλλάζει το πεδίοΠολύπλοκα μοντέλα
context.readΚαμίαΠοτέEvent handlers

Συχνές Ερωτήσεις

Ποια είναι η διαφορά μεταξύ Provider και BLoC;

Provider — περιτύλιγμα πάνω από το InheritedWidget για ενετοπισμό εξαρτήσεων με ChangeNotifier. BLoC — αρχιτεκτονικό πρότυπο με Event + Stream για απομόνωση λογικής.

Τι είναι το ChangeNotifierProvider;

ChangeNotifierProvider — τύπος Provider για στιγμιότυπα ChangeNotifier. Δημιουργεί αντικείμενο μέσω create και ανακατασκευάζει το Consumer όταν καλείται το notifyListeners.

Πώς να αποφύγω την περιττή ανακατασκευή με το Provider;

Χρησιμοποιήστε context.select αντί για context.watch. Χωρίστε τα μεγάλα ChangeNotifier σε μικρότερα.

Μπορώ να χρησιμοποιήσω το Provider χωρίς ChangeNotifier;

Ναί. Provider για αμετάβλητα αντικείμενα. StreamProvider για ροές. FutureProvider για Future. ProxyProvider για Provider που εξαρτώνται από άλλα.

Τι είναι το ProviderNotFoundException;

ProviderNotFoundException — εξαίρεση κατά τη λειτουργία που προκύπτει όταν γίνεται προσπάθεια να αποκτηθεί ένα Provider που δεν έχει δηλωθεί ψηλότερα στο δένδρο widget.

Περίληψη

  • Provider — περιτύλιγμα πάνω από InheritedWidget για διαχείριση κατάστασης και DI στο Flutter
  • ChangeNotifier — κλάση με notifyListeners για αντιδραστική ενημέρωση UI
  • Consumer και context.watch — εγγραφή σε αλλαγές με αυτόματη ανακατασκευή
  • MultiProvider — σύνθεση provider χωρίς φωλιάσματα δένδρου
  • ProxyProvider — αλυσίδα εξάρτησης μεταξύ Provider
  • context.select — σημειακή εγγραφή σε συγκεκριμένο πεδίο μοντέλου
  • StreamProvider και FutureProvider — ενσωματωμένη υποστήριξη για αντιδραστικά και ασύγχρονα δεδομένα

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης