Buttons, Slider

button family by rank (Elevated primary, Text flat, Outlined middle, Icon compact, FAB floating) અને Slider, widget જે Flutter નો controlled-widget law શીખવે છે: કોઈ setState નહીં, કોઈ movement નહીં.

11 min read · 9 cards · 2 checks

Read in: English · हिन्दी · ગુજરાતી


Theory

છ tickets, એક thumb

Group bookings arrive: student દીઠ 6 tickets સુધી. TextField જે "six" અને "6six" ને accept કરે છે તે old pain છે; natural control એ slider છે જે thumb ને 1 થી 6 સુધી drag કરે છે.

તમે Slider ને તેના min અને max સાથે wire કરો છો, run કરો છો, drag: અને thumb દરેક વાર 1 પર સીધો snap back થાય છે. broken નથી: Flutter તમને તેનો single most important interaction law શીખવી રહ્યું છે, અને આ lesson તેને properly learn કરવાની આસપાસ built છે: right after button family ને તેના ranks મળે છે.

Theory

button family, by rank

બધા buttons same heart ને share કરે છે (onPressed + child, null disables): શું differs છે તે visual rank છે:

  • ElevatedButton: raised, filled: THE primary action (Book)
  • OutlinedButton: bordered: middle-rank actions (Add to wishlist)
  • TextButton: flat text: secondary, low-noise (Cancel, Skip)
  • IconButton: icon-only, compact: toolbars (share, favourite)
  • FloatingActionButton: round floating one, Scaffold ના own floatingActionButton: slot માં living: one per screen, તેની defining action

rank = visual loudness = importance: one Elevated per region, quiet Texts તેની બાજુમાં.

Practical

quantity slider, done right

class _BookingState extends State<BookingScreen> {
  double tickets = 1;                    // STATE value ને own કરે છે

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Tickets: ${tickets.toInt()}'),
        Slider(
          value: tickets,                // slider state ને DISPLAYS કરે છે
          min: 1,
          max: 6,
          divisions: 5,                  // discrete stops: 1,2,3,4,5,6
          label: '${tickets.toInt()}',   // thumb પર bubble
          onChanged: (v) {
            setState(() { tickets = v; });   // no setState = snap-back
          },
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            TextButton(onPressed: () {}, child: const Text('Cancel')),
            ElevatedButton(
              onPressed: () { /* book tickets.toInt() seats */ },
              child: const Text('Book'),
            ),
          ],
        ),
      ],
    );
  }
}

Theory

controlled-widget law

શા માટે naked slider snap back થયો? કારણ કે Flutter Slider તેની position ને own નથી કરતો. listing ના loop ને read કરો:

  • value: tickets : slider DISPLAYS કરે છે whatever state variable hold કરે છે
  • dragging onChanged(v) ને fire કરે છે CANDIDATE value સાથે: continuously, drag દરમિયાન
  • તમારો handler variable ને setStates કરે છે : build reruns : slider હવે new value ને display કરે છે

setState ને skip કરો અને variable ક્યારેય change નથી થતું, તેથી દરેક rebuild thumb ને old value પર repaint કરે છે: snap-back. widget એ state નું view છે, ક્યારેય તેનો keeper નથી: અને Checkbox, Radio અને Switch, જે next lessons માં waiting કરે છે, identical law ને obey કરે છે.

Quiz

Slider પાસે correct min, max અને value છે, અને onChanged: (v) { tickets = v; } WITHOUT setState. user શું experience કરે છે?

  1. slider work કરે છે: variable છેવટે update થઈ રહ્યું છે
  2. thumb દરેક drag પર snap back થાય છે: variable changes થાય છે પણ કોઈ rebuild slider ને તેના સાથે repaint નથી કરતું
  3. compile error: onChanged એ setState ને call કરવું જોઈએ
  4. slider move થાય છે પણ Text label એક drag behind lag કરે છે
Show the answer

thumb દરેક drag પર snap back થાય છે: variable changes થાય છે પણ કોઈ rebuild slider ને તેના સાથે repaint નથી કરતું

variable DOES change થાય છે (option A નો grain of truth): પણ screen ફક્ત rebuild પર repaint થાય છે, અને ફક્ત setState એક schedule કરે છે: તેથી slider ... nothing થી rebuild થતું રહે છે, કોઈ rebuild happen નથી થતું કારણ કે: તે drag gesture ના next frame પર old position પર repaint થાય છે, snap back થઈને. આ controlled-widget law છે એક bug માં: widgets state ને display કરે છે; setState changes ને publish કરે છે. Option C: compiler તમારા intent ને know નથી કરી શકતો: આ logic bug છે, worst kind. Option D subtler staleness ને describe કરે છે જે other mistakes cause કરે છે: આ one total છે.

Think first

screen ના buttons ને Rank કરો

booking screen માંગે છે: Book (screen નો point), Cancel, heart icon wishlist માટે, અને screen-wide New Booking action જે આખા event list પર visible હોય. દરેક ને તેનું button variant assign કરો ranking reason સાથે, પછી tap.

Show the answer

Book: ElevatedButton: one loud primary per region. Cancel: TextButton: present પણ quiet, ક્યારેય Book સાથે compete નથી કરતું (listing તેમને exactly so place કરે છે). Wishlist heart: IconButton: compact, recognisable, toolbar-grade. list પર New Booking: FloatingActionButton Scaffold slot માં: THE screen action Material convention દ્વારા (WhatsApp ના compose button ને think કરો). principle: visual loudness એ importance ને match કરવી જોઈએ: 2 Elevated buttons side by side એ shouting match છે, અને exams તે કહેવાને reward કરે છે.

Watch out

Slider અને button slips

Slider value એ double છે: તેને raw display કરવું 3.0 tickets ને show કરે છે: humans માટે .toInt() (listing કરે છે, twice).

divisions off by one: stops = divisions + 1: range 1 થી 6 ને divisions: 5 ની જરૂર છે: fencepost ફરીથી.

onChanged DURING drag ફાયર થાય છે: continuously, release પર once નહીં: ત્યાં heavy work gesture ને stutters કરે છે (TextWatcher lesson નો rule, third appearance).

બે FABs: Scaffold slot એક લે છે; second floating action એ design smell છે, parameter નહીં.

Theory

એક law, આગળ ચાર widgets

controlled-widget law ને once frame કરો અને તેને lit રાખો: value state થી, change onChanged + setState દ્વારા, widget ક્યારેય તેનો own score keep નથી કરતો. next lesson ના Checkbox અને Radio આ law છે verbatim (Radio સાથે clever twist exclusivity પર જે BCA404 ના GroupBox veterans compare કરવા માંગશે), અને Unit 5 નો Switch તે છે ફરીથી. loop ને અહીં learn કરો, marks ને 3 more times collect કરો.

Summary

Key takeaways

  • Button ranks: ElevatedButton primary, OutlinedButton middle, TextButton quiet, IconButton compact, FAB Scaffold ના slot માં THE screen action માટે.
  • બધા onPressed (null = disabled) + child ને share કરે છે; loudness એ importance ને match કરવી જોઈએ.
  • Slider(value, min, max, divisions, label, onChanged): value એ double છે જે STATE own કરે છે.
  • Controlled-widget law: widget state ને display કરે છે; onChanged + setState changes ને publish કરે છે; setState વગર thumb snap back થાય છે.
  • divisions + 1 = stops; label thumb પર bubbles થાય છે; onChanged drag દરમિયાન continuously fires થાય છે.
  • same law Checkbox, Radio અને Switch ને govern કરે છે next.
  • Memory hook: widgets score ને show કરે છે, setState તેને writes કરે છે.

Study this properly

This page is the lesson to read. In Gri-Learn the same topic is a graded deck: the self-checks are scored and your weak topics are tracked. Free to start.

Start this topic

Already have an account? Sign in

More from Flutter basic widgets

Gri-Learn · syllabus-mapped B.C.A. lessons in English, Hindi and Gujarati

Buttons, Slider · Mobile Application Development - 2 (option B) · Gri-Learn