You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							186 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
	
	
							186 lines
						
					
					
						
							6.3 KiB
						
					
					
				| // SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru> | |
| // SPDX-License-Identifier: BSD-3-Clause | |
| import 'dart:async'; | |
| import 'dart:convert'; | |
|  | |
| import 'package:flutter/foundation.dart' show kIsAurora; | |
| import 'package:flutter/material.dart'; | |
| import 'package:flutter_example_packages/base/di/app_di.dart'; | |
| import 'package:flutter_example_packages/base/package/package.dart'; | |
| import 'package:flutter_example_packages/packages/sqflite/widgets/form_delete.dart'; | |
| import 'package:flutter_example_packages/packages/sqflite/widgets/form_insert.dart'; | |
| import 'package:flutter_example_packages/packages/sqflite/widgets/form_update.dart'; | |
| import 'package:flutter_example_packages/theme/radius.dart'; | |
| import 'package:flutter_example_packages/widgets/base/export.dart'; | |
| import 'package:flutter_example_packages/widgets/blocks/block_alert.dart'; | |
| import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; | |
| import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; | |
| import 'package:flutter_example_packages/widgets/texts/export.dart'; | |
| import 'package:flutter_gen/gen_l10n/app_localizations.dart'; | |
| import 'package:flutter_keyboard_visibility_aurora/flutter_keyboard_visibility_aurora.dart'; | |
|  | |
| import 'model.dart'; | |
| import 'package.dart'; | |
|  | |
| class SqflitePage extends AppStatefulWidget { | |
|   SqflitePage({ | |
|     super.key, | |
|   }); | |
|  | |
|   final Package package = packageSqflite; | |
|  | |
|   @override | |
|   State<SqflitePage> createState() => _SqflitePageState(); | |
| } | |
|  | |
| class _SqflitePageState extends AppState<SqflitePage> { | |
|   final _model = getIt<SqfliteModel>(); | |
|   bool _loading = true; | |
|  | |
|   final ScrollController _scrollController = ScrollController(); | |
|   final _controllerAurora = FlutterKeyboardVisibilityAurora(); | |
|   StreamSubscription? _streamSub; | |
|   double _keyboardHeight = 0; | |
|  | |
|   @override | |
|   void initState() { | |
|     super.initState(); | |
|     // Init database | |
|     _model.init().then((_) { | |
|       if (mounted) { | |
|         setState(() { | |
|           _loading = false; | |
|         }); | |
|       } | |
|     }); | |
|     // Get keyboard height | |
|     if (kIsAurora) { | |
|       _streamSub = _controllerAurora.onChangeHeight.listen((event) { | |
|         setState(() { | |
|           _keyboardHeight = event; | |
|         }); | |
|       }); | |
|     } | |
|   } | |
|  | |
|   @override | |
|   void dispose() { | |
|     super.dispose(); | |
|     // Close database | |
|     _model.close(); | |
|     // Cancel listen | |
|     _streamSub?.cancel(); | |
|   } | |
|  | |
|   @override | |
|   Widget buildWide( | |
|     BuildContext context, | |
|     MediaQueryData media, | |
|     AppLocalizations l10n, | |
|   ) { | |
|     return BlockLayout<SqfliteModel>( | |
|       model: _model, | |
|       loading: _loading, | |
|       title: widget.package.key, | |
|       builder: (context, child, model) { | |
|         return SingleChildScrollView( | |
|           controller: _scrollController, | |
|           padding: EdgeInsets.only(bottom: _keyboardHeight), | |
|           child: Padding( | |
|             padding: const EdgeInsets.all(20), | |
|             child: Column( | |
|               crossAxisAlignment: CrossAxisAlignment.start, | |
|               children: [ | |
|                 BlockInfoPackage(widget.package), | |
|                 BlockAlert(model.error), | |
|                 if (!model.isError) | |
|                   Column( | |
|                     crossAxisAlignment: CrossAxisAlignment.start, | |
|                     children: [ | |
|                       TextTitleLarge(l10n.sqfliteTitleState), | |
|                       const SizedBox(height: 14), | |
|                       Container( | |
|                         width: double.infinity, | |
|                         decoration: BoxDecoration( | |
|                           color: Colors.blue.shade50, | |
|                           borderRadius: AppRadius.small, | |
|                         ), | |
|                         child: Padding( | |
|                           padding: const EdgeInsets.all(10), | |
|                           child: TextBodyMedium( | |
|                             const JsonEncoder.withIndent('   ') | |
|                                 .convert(model.data), | |
|                           ), | |
|                         ), | |
|                       ), | |
|                       const SizedBox(height: 20), | |
|                       SizedBox( | |
|                         width: double.infinity, | |
|                         child: ElevatedButton( | |
|                           onPressed: model.data.isEmpty | |
|                               ? null | |
|                               : () async { | |
|                                   await model.clear(); | |
|                                   _scrollToTop(); | |
|                                 }, | |
|                           child: TextBodyLarge( | |
|                             l10n.sqfliteTitleBtnClear, | |
|                             color: Colors.white, | |
|                           ), | |
|                         ), | |
|                       ), | |
|                       const SizedBox(height: 20), | |
|                       TextTitleLarge(l10n.sqfliteTitleInsert), | |
|                       const SizedBox(height: 20), | |
|                       SqfliteFormInsert(( | |
|                         String name, | |
|                         int value, | |
|                         double num, | |
|                       ) async { | |
|                         await model.insert(name, value, num); | |
|                         _scrollToTop(); | |
|                       }), | |
|                       const SizedBox(height: 20), | |
|                       TextTitleLarge(l10n.sqfliteTitleUpdate), | |
|                       const SizedBox(height: 20), | |
|                       SqfliteFormUpdate(( | |
|                         int id, | |
|                         String name, | |
|                         int value, | |
|                         double num, | |
|                       ) async { | |
|                         if (await model.update(id, name, value, num)) { | |
|                           _scrollToTop(); | |
|                           return true; | |
|                         } | |
|                         return false; | |
|                       }), | |
|                       const SizedBox(height: 20), | |
|                       TextTitleLarge(l10n.sqfliteTitleDelete), | |
|                       const SizedBox(height: 20), | |
|                       SqfliteFormDelete((int id) async { | |
|                         if (await model.delete(id)) { | |
|                           _scrollToTop(); | |
|                           return true; | |
|                         } | |
|                         return false; | |
|                       }), | |
|                     ], | |
|                   ) | |
|               ], | |
|             ), | |
|           ), | |
|         ); | |
|       }, | |
|     ); | |
|   } | |
|  | |
|   void _scrollToTop() { | |
|     // scroll to top | |
|     _scrollController.animateTo( | |
|       0, | |
|       duration: const Duration(milliseconds: 500), | |
|       curve: Curves.ease, | |
|     ); | |
|   } | |
| }
 | |
| 
 |