Sobes.tech
Middle

Ի՞նչ է InheritedWidget-ը և ինչպես օգտագործել այն Flutter-ում։

sobes.tech AI

Պատասխան AI-ից

InheritedWidget — դա հատուկ տեսակի widget է Flutter-ում, որը թույլ է տալիս արդյունավետորեն տարածել տեղեկատվությունը դեպի ներքև՝ widget-ների ծառի վրա։ Այն օգտագործվում է տվյալներ և ծառայություններ տրամադրելու համար widget-ների ենթա ծառին՝ առանց անհրաժեշտության դրանք հստակ փոխանցելու յուրաքանչյուր միջնորդ widget-ի կոնստրուկտորների միջոցով:

Հիմնական առանձնահատկությունները՝

  • Տվյալների արդյունավետ տարածում: Երբ փոխվում է InheritedWidget-ը, Flutter-ը ավտոմատ կերպով վերականգնում է միայն այն widget-ները, որոնք կախված են նրանից:
  • Հեշտ հասանելիություն տվյալներին: Երեխա widget-ները կարող են ստանալ տվյալների հասանելիությունը of() ստատիկ մեթոդի միջոցով:
  • Հետևողականության կառավարում: updateShouldNotify մեթոդը թույլ է տալիս վերահսկել, երբ պետք է վերականգնել կախված widget-ները:

Ինչպես օգտագործել InheritedWidget-ը:

  1. Ստեղծել InheritedWidget-ից ժառանգվող դաս:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Տվյալները, որոնք տարածվելու են
    
      // Մեթոդ՝ ստանալու InheritedWidget-ի օրինակ
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'No MyInheritedWidget found in context');
        return result!;
      }
    
      // Կառավարում է, երբ պետք է տեղեկացնել կախված widget-ներին
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Հետեւողականություն՝ եթե տվյալները փոխվել են
      }
    }
    
  2. Տեղադրել InheritedWidget-ը widget ծառի մեջ:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Օղակած է widget ծառը
          data: 'Բարեւ InheritedWidget-ից',
          child: MaterialApp(
            title: 'InheritedWidget Demo',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('InheritedWidget Demo'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget, որը կօգտագործի տվյալները
              ),
            ),
          ),
        );
      }
    }
    
  3. Հասանելիություն ստանալ տվյալներին երեխա widget-ից:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Տվյալների հասանելիություն՝ of() մեթոդով
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget-ը հիմքն է շատ state management լուծումների՝ Provider, Bloc, համար։ Այն ապահովում է արդյունավետ և դեկլարատիվ եղանակ տվյալների փոխանակման համար widget ծառի մեջ։