जब मैंने निम्नलिखित कोड लिखा, तो मुझे उम्मीद थी कि पाठ लाल होगा:

Theme(
  data: Theme.of(context).copyWith(
    textTheme: Theme.of(context).textTheme.copyWith(
      bodyText2: TextStyle(color: Colors.red),
    ),
    buttonTheme: Theme.of(context)
        .buttonTheme
        .copyWith(buttonColor: Colors.yellow),
  ),
  child: Builder(
    builder: (context) {
      return Column(
        children: [
          Text('Flutter'),
          Text('is awesome!'),
          RaisedButton(
            onPressed: () {},
            child: Text('OK'),
          )
        ],
      );
    },
  ),
)

लेकिन टेक्स्ट काला था जबकि बटन पीला था जैसा कि आप देख सकते हैं: यहां

जैसा कि आप देख सकते हैं कि Text विजेट्स ने थीम में परिभाषित शैली को अनदेखा कर दिया जबकि RaisedButton ने ऐसा नहीं किया। क्यों?

मुझे पता है कि मैं इसके बजाय DefaultTextStyle का उपयोग कर सकता हूं, लेकिन मैं यह समझने की कोशिश कर रहा हूं कि यह मेरी अपेक्षा के अनुरूप काम क्यों नहीं कर रहा है।

0
Marwén 8 फरवरी 2021, 14:02

1 उत्तर

सबसे बढ़िया उत्तर

Text विजेट में style प्रॉपर्टी है। जैसा कि हम docs से देख सकते हैं:

If the [style] argument is null, the text will use the style from the
closest enclosing [DefaultTextStyle].

यह स्पष्ट है कि टेक्स्ट DefaultTextStyle विजेट से शैली का उपयोग करता है (Theme से नहीं) यदि आपने इसे वैसे ही निर्दिष्ट नहीं किया है जैसा आपने किया था। यदि आप विषय से शैली का उपयोग करना चाहते हैं तो आपको इसे स्पष्ट रूप से निर्दिष्ट करना चाहिए:

 Text('Flutter', style: Theme.of(context).textTheme.bodyText2)

बटनों के लिए - कोई भी मटेरियलबटन चाइल्ड (RaisedButton भी) ButtonTheme.of(context).textTheme का उपयोग textTheme संपत्ति के डिफ़ॉल्ट मान के रूप में करता है।

1
Mol0ko 8 फरवरी 2021, 14:31
शुक्रिया! यह समझ में आता है लेकिन फिर भी मेरे लिए अजीब लग रहा है क्योंकि हमें DefaultTextStyle को स्पष्ट रूप से जोड़ने की आवश्यकता नहीं है अगर हम MaterialApp स्तर पर एक विषय को परिभाषित करते हैं।
 – 
Marwén
8 फरवरी 2021, 16:25