首页 > 解决方案 > 如何重建 listview.builder?

问题描述

我需要重建我的列表视图,因为它只维护第一个构建,除非我重置应用程序。我有一个底部表单弹出,让我选择时间并将我导航到 listview.builder 构建的新页面。如果我退出页面,选择新选项,然后返回页面,它不会更新。这是一个例子:

第一种组合

完美运行

然而,现在我选择了不同的组合

与第一个组合相同的构建

相关代码:

final selectTimesTextStyle = TextStyle(
  fontSize: 20,
  fontWeight: FontWeight.bold,
);

final List classBools = [
  checkedPreBallet,
  checkedBeginningBallet,
  checkedIntermediateBallet,
  checkedAdvancedBallet,
  checkedJazz,
  checkedPC,
];

final List<String> preballetItems = [
  'Wednesday 3:00-4:00',
  'Friday 3:00-3:35',
];

final List<String> privateClassesItems = [
  'Mondays, Schedule Via Email',
];

final List<String> intermediateBalletItems = [
  'Tuesday 5:00-6:00',
  'Thursday 5:00-6:00',
  'Saturday 10:00-11:00',
];

final List<String> advancedBalletItems = [
  'Tuesday 6:00-7:00',
  'Thursday 6:00-7:00',
];

final List<String> beginningBalletItems = [
  'Wednesday 3:45-4:45',
  'Friday 3:45-4:45',
];

final List<String> jazzItems = [
  'Thursday 4:00-5:00',
];

final List<List> listOfLists = [
  preballetItems,
  beginningBalletItems,
  intermediateBalletItems,
  advancedBalletItems,
  jazzItems,
  privateClassesItems,
];

List<String> valueChoose = [
  'Wednesday 3:00-4:00',
  'Wednesday 3:45-4:45',
  'Tuesday 5:00-6:00',
  'Tuesday 6:00-7:00',
  'Thursday 4:00-5:00',
  'Mondays, Schedule Via Email',
];

class TimeSelection extends StatelessWidget {
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          leading: InkWell(
            onTap: () => {
              Navigator.of(context).pop(),
              currentIndex = 2,
              checkedPreBallet = false,
              checkedBeginningBallet = false,
              checkedIntermediateBallet = false,
              checkedAdvancedBallet = false,
              checkedJazz = false,
              checkedPC = false,
            },
            child: Container(
              child: Icon(Icons.arrow_back),
            ),
          ),
          title: Text('Select Times'),
          centerTitle: true,
        ),
        body: StatefulBuilder(
          builder: (context, setState) => Column(
            children: [
              Expanded(
                child: ListView.builder(
                  itemCount: 6,
                  itemBuilder: (context, index) => Visibility(
                    maintainState: false,
                    visible: classBools[index],
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        Container(
                          child: Text(
                            buttonTitles[index],
                            style: selectTimesTextStyle,
                          ),
                          width: MediaQuery.of(context).size.width * 0.50,
                        ),
                        Container(
                          width: MediaQuery.of(context).size.width * 0.40,
                          child: DropdownButton(
                            isExpanded: true,
                            underline: SizedBox(),
                            dropdownColor: Colors.white,
                            value: valueChoose[index],
                            onChanged: (newValue) => {
                              setState(() {
                                valueChoose[index] = newValue;
                              })
                            },
                            items: listOfLists[index]
                                .map((e) => DropdownMenuItem(
                              onTap: () => {
                                classBools[index] = true,
                              },
                              child: Text(e),
                              value: e,
                            ))
                                .toList(),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.symmetric(
                  horizontal: 120,
                  vertical: 15,
                ),
                child: Container(
                  decoration: BoxDecoration(
                    gradient: LinearGradient(
                        begin: Alignment.topCenter,
                        end: Alignment.bottomCenter,
                        stops: [
                          0.00005,
                          1,
                        ],
                        colors: [
                          Theme.of(context).secondaryHeaderColor,
                          Theme.of(context).primaryColor,
                        ]),
                    boxShadow: [
                      BoxShadow(color: Colors.black54, offset: Offset(3, 3)),
                    ],
                    color: Colors.purpleAccent,
                    borderRadius: BorderRadius.circular(15),
                  ),
                  child: InkWell(
                    onTap: () => {},
                    child: Padding(
                      padding: EdgeInsets.all(16),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          Text('PayPal'),
                        ],
                      ),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      );
  }
}


bool checkedPreBallet = false;
bool checkedBeginningBallet = false;
bool checkedIntermediateBallet = false;
bool checkedAdvancedBallet = false;
bool checkedJazz = false;
bool checkedPC = false;

final List<String> buttonTitles = [
  'Pre-Ballet',
  'Beginning Ballet',
  'Intermediate Ballet',
  'Advanced Ballet',
  'Jazz',
  'Private Classes',
];

class RegisterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Divider(),
          Text('hello'),
          Divider(),
          RegisterCards(),
        ],
      ),
    );
  }
}

class RegisterCards extends StatefulWidget {
  @override
  _RegisterCardsState createState() => _RegisterCardsState();
}

class _RegisterCardsState extends State<RegisterCards> {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(
        horizontal: 30,
      ),
      child: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              stops: [
                0.00005,
                1,
              ],
              colors: [
                Theme.of(context).secondaryHeaderColor,
                Theme.of(context).primaryColor,
              ]),
          boxShadow: [
            BoxShadow(color: Colors.black54, offset: Offset(3, 3)),
          ],
          color: Colors.purpleAccent,
          borderRadius: BorderRadius.circular(15),
        ),
        child: InkWell(
          onTap: () => onButtonPressed(context),
          child: Padding(
            padding: EdgeInsets.all(16),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                Text('Register Here'),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class ClassListWidget extends StatefulWidget {


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

class _ClassListWidgetState extends State<ClassListWidget> {
  @override
  Widget build(BuildContext context) {
    return StatefulBuilder(
      builder: (context, setState) => Column(
        children: [
          CheckboxListTile(
            value: checkedPreBallet,
            onChanged: (value) => {
              setState(() {
                checkedPreBallet = value;
              })
            },
            title: Text('Pre-Ballet'),
            checkColor: Theme.of(context).scaffoldBackgroundColor,
            activeColor: Theme.of(context).primaryColor,
            secondary: Icon(PokemonIcons.i004_charmander),
            controlAffinity: ListTileControlAffinity.leading,
            tristate: false,
          ),
          CheckboxListTile(
            value: checkedBeginningBallet,
            onChanged: (value) => {
              setState(() {
                checkedBeginningBallet = value;
              })
            },
            title: Text('Beginning Ballet'),
            checkColor: Theme.of(context).scaffoldBackgroundColor,
            activeColor: Theme.of(context).primaryColor,
            secondary: Icon(PokemonIcons.i004_charmander),
            controlAffinity: ListTileControlAffinity.leading,
            tristate: false,
          ),
          CheckboxListTile(
            value: checkedIntermediateBallet,
            onChanged: (value) => {
              setState(() {
                checkedIntermediateBallet = value;
              })
            },
            title: Text('Intermediate Ballet'),
            checkColor: Theme.of(context).scaffoldBackgroundColor,
            activeColor: Theme.of(context).primaryColor,
            secondary: Icon(PokemonIcons.i004_charmander),
            controlAffinity: ListTileControlAffinity.leading,
            tristate: false,
          ),
          CheckboxListTile(
            value: checkedAdvancedBallet,
            onChanged: (value) => {
              setState(() {
                checkedAdvancedBallet = value;
              })
            },
            title: Text('Advanced Ballet'),
            checkColor: Theme.of(context).scaffoldBackgroundColor,
            activeColor: Theme.of(context).primaryColor,
            secondary: Icon(PokemonIcons.i004_charmander),
            controlAffinity: ListTileControlAffinity.leading,
            tristate: false,
          ),
          CheckboxListTile(
            value: checkedJazz,
            onChanged: (value) => {
              setState(() {
                checkedJazz = value;
              })
            },
            title: Text('Jazz'),
            checkColor: Theme.of(context).scaffoldBackgroundColor,
            activeColor: Theme.of(context).primaryColor,
            secondary: Icon(PokemonIcons.i004_charmander),
            controlAffinity: ListTileControlAffinity.leading,
            tristate: false,
          ),
          CheckboxListTile(
            value: checkedPC,
            onChanged: (value) => {
              setState(() {
                checkedPC = value;
              })
            },
            title: Text('Private Classes'),
            checkColor: Theme.of(context).scaffoldBackgroundColor,
            activeColor: Theme.of(context).primaryColor,
            secondary: Icon(PokemonIcons.i004_charmander),
            controlAffinity: ListTileControlAffinity.leading,
            tristate: false,
          ),
        ],
      ),
    );
  }
}

  void onButtonPressed(context) {
    showModalBottomSheet(
      isScrollControlled: false,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(15),
          topRight: Radius.circular(15),
        ),
      ),
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      context: context,
      builder: (context) => StatefulBuilder(
        builder: (BuildContext context, setState) => Container(
          child: Column(
            children: [
              ClassListWidget(),
              Padding(
                padding: const EdgeInsets.symmetric(
                  horizontal: 15,
                ),
                child: Container(
                  decoration: BoxDecoration(
                    gradient: LinearGradient(
                        begin: Alignment.topCenter,
                        end: Alignment.bottomCenter,
                        stops: [
                          0.00005,
                          1,
                        ],
                        colors: [
                          Theme.of(context).secondaryHeaderColor,
                          Theme.of(context).primaryColor,
                        ]),
                    boxShadow: [
                      BoxShadow(color: Colors.black54, offset: Offset(3, 3)),
                    ],
                    color: Colors.purpleAccent,
                    borderRadius: BorderRadius.circular(15),
                  ),
                  child: InkWell(
                    onTap: () => {
                      Navigator.push(context, MaterialPageRoute(
                        builder: (context) => TimeSelection(),
                      )),
                    },
                    child: Padding(
                      padding: EdgeInsets.all(14),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          Text('Select Times'),
                        ],
                      ),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

标签: androidflutterdartstate

解决方案


检查它是否符合您的需要。

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(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: TimeSelection(),
    );
  }
}
// model class for your ballet
class Ballet {
  final String balletName;
  final List<String> timeSchedules;
  final String description;
  String selectedTime;
  bool isSelected = false;

  Ballet({
    this.balletName,
    this.timeSchedules,
    isSelected,
    this.description = '',
    this.selectedTime
  }) {selectedTime ??= this.timeSchedules[0];}
}

List<Ballet> balletItems = <Ballet>[
  Ballet(
    balletName: "Pre-Ballet",
    timeSchedules: [
      'Wednesday 3:00-4:00',
      'Friday 3:00-3:35',
    ],
  ),
  Ballet(
      balletName: "Private Classes",
      timeSchedules: [
        'Mondays',
      ],
      description: 'Scheduled Via Email'
  ),
  Ballet(
    balletName: "Intermediate Ballet",
    timeSchedules: [
      'Tuesday 5:00-6:00',
      'Thursday 5:00-6:00',
      'Saturday 10:00-11:00',
    ],
  ),
  Ballet(
    balletName: "Advance Ballet",
    timeSchedules: [
      'Tuesday 6:00-7:00',
      'Thursday 6:00-7:00',
    ],
  ),
  Ballet(
    balletName: "Beginning Ballet",
    timeSchedules: [
      'Wednesday 3:45-4:45',
      'Friday 3:45-4:45',
    ],
  ),
  Ballet(
    balletName: "Jazz Ballet",
    timeSchedules: [
      'Thursday 4:00-5:00',
    ],
  )

];

class TimeSelection extends StatefulWidget {
  @override
  _TimeSelectionState createState() => _TimeSelectionState();
}

class _TimeSelectionState extends State<TimeSelection> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Center(
            child: Column(
              children: [
                Text('hello there', style: Theme.of(context).textTheme.headline4),
                ElevatedButton(child: Text('Register Here',), onPressed: () {},),
              ],
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: balletItems.length+1 ,
              itemBuilder: (context, index){
                if (index < balletItems.length) {
                  Ballet balletItem = balletItems[index];
                  return ListTile(leading: Checkbox(
                    value: balletItem.isSelected,
                    onChanged: (value) {
                      setState((){
                        balletItem.isSelected = value;
                      });
                    },),
                    title: Text(balletItem.balletName),
                    trailing: Icon(Icons.auto_awesome),
                  );}
                else{
                  return Container(
                    margin: const EdgeInsets.symmetric(horizontal: 20.0),
                    child: ElevatedButton(
                      onPressed: () {
                        Navigator.of(context).push(MaterialPageRoute(builder: (context) => SelectTimes(),));
                      },
                      child: Text('Select Times'),
                    ),
                  );}
              },
            ),
          )
        ],
      ),

      drawer: Drawer(),
      appBar: AppBar(title: Text("Class Registration"),),
    );
  }
}

class SelectTimes extends StatefulWidget {
  @override
  _SelectTimesState createState() => _SelectTimesState();
}

class _SelectTimesState extends State<SelectTimes> {
  List<Ballet> selectedBalletItems;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Select Times'),),
      body: Padding(
        padding: const EdgeInsets.all(10.0),
        child: Column(
          children: [
            Expanded(
              child: ListView.builder(
                itemCount: selectedBalletItems.length,
                itemBuilder: (context, index) {
                  Ballet selectedBalletItem = selectedBalletItems[index];
                  return _listTile(selectedBalletItem);
                },
              ),
            ),
            ElevatedButton(child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text("PayPal", style: Theme.of(context).textTheme.headline4,
              ),
            ),
            onPressed: () {},)
          ],
        ),
      )
    );
  }
  Widget _listTile(Ballet selectedBalletItem) {
    return ListTile(
        title: Text(selectedBalletItem.balletName),
        subtitle: Text(selectedBalletItem.description , style: Theme.of(context).textTheme.bodyText2.copyWith(color: Colors.grey[500])),
        trailing: DropdownButton<String>(
          value: selectedBalletItem.selectedTime,
          items: selectedBalletItem.timeSchedules.map((timeSchedule) {
            return DropdownMenuItem(value: timeSchedule, child: Text(timeSchedule));
          } ).toList(),
          onChanged: (value) {
            setState(() {
              selectedBalletItem.selectedTime = value;
            });
          },
        )
    );
  }

  @override
  void initState() {
    super.initState();
    selectedBalletItems = balletItems.where((e) => e.isSelected).toList();

  }
}

推荐阅读