| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| |
| /// Flutter code sample for [KeepAlive]. |
| /// |
| /// This example demonstrates how to use the [KeepAlive] to preserve the state |
| /// of individual list items in a `ListView` when they are scrolled out of view. |
| /// Each item has a counter that maintains its state. |
| void main() { |
| runApp(const KeepAliveExampleApp()); |
| } |
| |
| class KeepAliveExampleApp extends StatelessWidget { |
| const KeepAliveExampleApp({super.key}); |
| |
| @override |
| Widget build(BuildContext context) { |
| return MaterialApp( |
| home: Scaffold( |
| appBar: AppBar(title: const Text('KeepAlive Example')), |
| body: ListView.builder( |
| addAutomaticKeepAlives: false, |
| addRepaintBoundaries: false, |
| addSemanticIndexes: false, |
| itemCount: 100, |
| itemBuilder: (BuildContext context, int index) { |
| return KeepAlive( |
| keepAlive: index.isEven, |
| child: _KeepAliveItem(index: index), |
| ); |
| }, |
| ), |
| ), |
| ); |
| } |
| } |
| |
| class _KeepAliveItem extends StatefulWidget { |
| const _KeepAliveItem({required this.index}); |
| |
| final int index; |
| |
| @override |
| State<_KeepAliveItem> createState() => _KeepAliveItemState(); |
| } |
| |
| class _KeepAliveItemState extends State<_KeepAliveItem> { |
| int _counter = 0; |
| |
| @override |
| Widget build(BuildContext context) { |
| return ListTile( |
| title: Text('Item ${widget.index}: $_counter'), |
| trailing: IconButton( |
| icon: const Icon(Icons.add), |
| onPressed: () { |
| setState(() { |
| _counter++; |
| }); |
| }, |
| ), |
| ); |
| } |
| } |