Как использовать itemBuilder для выбора последнего отображаемого виджета ListTile?

#flutter #dart

#flutter #dart

Вопрос:

Я пытаюсь изменить выбранное свойство последнего выбранного виджета ListTile на true внутри ящика (а затем, очевидно, выбранное свойство других ListTiles на false), но я не понимаю, как я могу использовать itemBuilder (который упоминается в официальных документах flutter) для этого. Я попытался поместить свои ListTiles в виджет AnimatedListItemBuilder, но у меня это не сработало.

 Widget _buildDrawer() {
    return ListView(
          // Important: Remove any padding from the ListView.
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              child:
                Wrap(
                  alignment: WrapAlignment.center,
                  direction: Axis.vertical,
                  children: <Widget>[
                    Text(
                      _currentUser.displayName, 
                      style: TextStyle(
                        fontSize: 20,
                        color: Colors.white
                      ),  
                    ),
                    Wrap(
                      direction: Axis.vertical,
                      children: <Widget>[
                        Text(
                        "Iskolai kategória: A", 
                          style: TextStyle(
                            fontSize: 18,
                            color: Colors.white70
                          ),  
                        ),
                        Text(
                          "Kollégiumi kategória: A", 
                          style: TextStyle(
                            fontSize: 18,
                            color: Colors.white70
                          ),  
                        ),
                      ],
                    )
                  ],
                ),
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              selected: true,
              leading: Icon(Icons.date_range_rounded),
              title: Text('Stúdium jelentkezés'),
              onTap: () {
              // Update the state of the app.
              // ...
              // Then close the drawer.
              Navigator.pop(context);
            },
            ),
            ListTile(
              leading: Icon(Icons.article_rounded),
              title: Text('Koleszhírek'),
              onTap: () {
                // Update the state of the app.
                // ...
                Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.account_box_rounded),
              title: Text('Profil'),
              onTap: () {
                // Update the state of the app.
                // ...
               Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.logout),
              title: Text('Kijelentkezés'),
              onTap: () => {
                _googleSignIn.disconnect(),
                Navigator.pop(context)
              },
            ),
          ],
        );
  }
  

Ответ №1:

Вы должны сохранить «выбранный индекс» в переменной и проверить, равен ли текущий индекс выбранному индексу, чтобы выделить ListView. Я обновил ваш код, чтобы он работал.

 import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}


class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _selectedIndex = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      drawer: _buildDrawer(context),
      body: Center(
        child: Text("DrawerHeader Demo"),
      ),
    );
  }

  Widget _buildDrawer(BuildContext context) {
    List<Widget> leading = [
      Icon(Icons.date_range_rounded),
      Icon(Icons.article_rounded),
      Icon(Icons.account_box_rounded),
      Icon(Icons.logout),
    ];
    List<Widget> title = [
      Text('Stúdium jelentkezés'),
      Text('Koleszhírek'),
      Text('Profil'),
      Text('Kijelentkezés'),
    ];

    return Container(
      color: Colors.white,
      child: ListView(
        padding: EdgeInsets.zero,
        children: <Widget>[
          DrawerHeader(
            child: Wrap(
              alignment: WrapAlignment.center,
              direction: Axis.vertical,
              children: <Widget>[
                Text(
                  "A",
                  style: TextStyle(fontSize: 20, color: Colors.white),
                ),
                Wrap(
                  direction: Axis.vertical,
                  children: <Widget>[
                    Text(
                      "Iskolai kategória: A",
                      style: TextStyle(fontSize: 18, color: Colors.white70),
                    ),
                    Text(
                      "Kollégiumi kategória: A",
                      style: TextStyle(fontSize: 18, color: Colors.white70),
                    ),
                  ],
                )
              ],
            ),
            decoration: BoxDecoration(
              color: Colors.blue,
            ),
          ),
          ListView.builder(
            itemCount: 4,
            shrinkWrap: true,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(
                title: title[index],
                leading: leading[index],
                selected: index == _selectedIndex,
                onTap: () {
                  setState(() {
                    _selectedIndex = index;
                    Navigator.pop(context);
                  });
                },
              );
            },
          ),
        ],
      ),
    );
  }
}