Flutter增强容器插件enhanced_containers的使用
Flutter增强容器插件enhanced_containers的使用
这是一个集合了Dart和Flutter中的List
和Map
容器接口的库。
目录
如何使用enhanced_containers包
有一个例子展示了如何使用该包。简单来说,ListXxx
和MapXxx
可以像普通的List
和Map
一样使用。例如,如果声明了一个ListProvider
,那么这个ListProvider
可以作为普通的List
使用,但会自动处理notifyListeners()
的相关操作。
ItemSerializable
这是任何enhanced_container
的基本项,即如果要使用任何enhanced_container
,则项目必须是一个ItemSerializable
。
要声明一个ItemSerializable
,需要提供serializeMap()
方法,该方法返回应可序列化的项(即基本类型如int
、double
、String
等或另一个ItemSerializable
)。
列表
ListSerializable
ListSerializable
是一个可以序列化的List
(即其中的项为ItemSerializable
类型)。这在将List
发送到数据库时特别有用。
要声明一个ListSerializable
,需要提供一个ItemSerializable deserializeItem(data)
方法,该方法调用(或实现)ItemSerializable.serializeMap()
的反过程。此方法会在需要时自动调用。
ListProvider
ListProvider
基本上是一个ListSerializable
,但它会调用notifyListeners()
。
FirebaseListProvided
顾名思义,FirebaseListProvided
是一个ListProvider
,它会调用Firebase数据库并自行更新键,同时作为一个提供者。
要构建一个FirebaseListProvided
,需要声明一个带有pathToData
构造函数,例如:FirebaseListOfMyRandomItem({required super.pathToData});
。可选地,也可以指定pathToAvailableDataIds
。默认情况下,pathToAvailableDataIds
是pathToData
加上ids
。
可用ID是一种确保一个人不会看到其他用户的数据的方法。例如,如果person1向列表添加数据而person2也添加数据,所有数据都存储在pathToData
中,但只有标记为可用的数据才会分别显示给person1和person2。
映射
MapSerializable
与ListSerializable
类似,MapSerializable
基本上是一个包含ItemSerializable
的Map
。
要声明一个MapSerializable
,需要提供一个ItemSerializable deserializeItem(data)
方法,该方法调用(或实现)ItemSerializable.serializeMap()
的反过程。此方法会在需要时自动调用。
MapProvided
MapProvider
基本上是一个MapSerializable
,但它会调用notifyListeners()
。
FirebaseMapProvided
目前还没有FirebaseMapProvided
。如果需要,可以将MapSerializable
包装在一个ListSerializable
中。
示例
可以在官方Git仓库中找到一个示例:https://github.com/cr-crme/enhanced_containers/。
这个示例可以作为模板来构建自己的enhanced_containers
。
如何贡献
增强增强器
并非所有的List
和Map
方法都在其各自的增强版本中实现。可以通过实现这些方法来提供帮助。
更多数据库
目前只有Firebase接口数据库实现,但没有理由只拥有它们。任何想要帮忙的人都可以实现更多的数据库。
文档
请毫不犹豫地纠正或修改文档,因为更好的文档意味着更好的可用性!
引用
如果使用,请引用该包如下:
@misc{
MichaudEnhancedContainers2022,
author = {Michaud, Benjamin and Stephenne, Laurent},
title = {Enhanced containers for Dart and Flutter},
howpublished={Web page},
url = {https://github.com/cr-crme/enhanced_containers},
year = {2022}
}
完整示例代码
以下是完整的示例代码,展示了如何使用enhanced_containers
插件。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// 导入自定义的提供者类
import './providers/list_of_my_random_item.dart';
import './providers/map_of_my_random_item.dart';
import './screens/main_screen.dart';
import './screens/shared_data_first_screen.dart';
import './screens/shared_data_second_screen.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MultiProvider(
providers: [
// 创建并注册 ListOfMyRandomItem 提供者
ChangeNotifierProvider(create: (context) => ListOfMyRandomItem()),
// 创建并注册 MapOfMyRandomItem 提供者
ChangeNotifierProvider(create: (context) => MapOfMyRandomItem()),
],
child: MaterialApp(
title: '增强容器演示',
initialRoute: MainScreen.route,
routes: {
MainScreen.route: (context) => const MainScreen(),
SharedDataFirstScreen.route: (context) => const SharedDataFirstScreen(),
SharedDataSecondScreen.route: (context) => const SharedDataSecondScreen(),
},
),
);
}
}
更多关于Flutter增强容器插件enhanced_containers的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter增强容器插件enhanced_containers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
enhanced_containers
是一个 Flutter 插件,它提供了一些增强的容器类,可以简化开发者在 Flutter 应用中使用容器时的一些常见操作。以下是如何使用 enhanced_containers
插件的基本步骤和一些常见用法。
1. 安装插件
首先,你需要在 pubspec.yaml
文件中添加 enhanced_containers
依赖:
dependencies:
flutter:
sdk: flutter
enhanced_containers: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 enhanced_containers
:
import 'package:enhanced_containers/enhanced_containers.dart';
3. 使用增强的容器类
enhanced_containers
提供了以下几种增强的容器类:
EnhancedContainer
EnhancedContainer
是一个增强版的 Container
,它支持更多的属性和功能。
EnhancedContainer(
width: 200,
height: 200,
color: Colors.blue,
borderRadius: BorderRadius.circular(10),
shadow: BoxShadow(
color: Colors.black.withOpacity(0.3),
blurRadius: 10,
spreadRadius: 2,
),
child: Center(
child: Text(
'Enhanced Container',
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
)
EnhancedListView
EnhancedListView
是一个增强版的 ListView
,它支持更多的属性和功能,例如自动滚动、动态加载等。
EnhancedListView(
itemCount: 20,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
onEndReached: () {
// 当列表滚动到底部时触发
print('End reached!');
},
)
EnhancedGridView
EnhancedGridView
是一个增强版的 GridView
,它支持更多的属性和功能,例如自动滚动、动态加载等。
EnhancedGridView.count(
crossAxisCount: 2,
children: List.generate(20, (index) {
return Container(
color: Colors.blue,
child: Center(
child: Text(
'Item $index',
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
);
}),
onEndReached: () {
// 当网格滚动到底部时触发
print('End reached!');
},
)
4. 其他功能
enhanced_containers
还提供了其他一些功能,例如:
EnhancedColumn
和EnhancedRow
:增强版的Column
和Row
,支持更多的布局选项。EnhancedStack
:增强版的Stack
,支持更多的布局选项。EnhancedAnimatedContainer
:增强版的AnimatedContainer
,支持更多的动画效果。
5. 自定义和扩展
你可以通过继承这些增强的容器类来自定义和扩展它们的行为,以满足你的特定需求。
6. 示例代码
以下是一个完整的示例代码,展示了如何使用 enhanced_containers
插件:
import 'package:flutter/material.dart';
import 'package:enhanced_containers/enhanced_containers.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Enhanced Containers Example'),
),
body: SingleChildScrollView(
child: Column(
children: [
EnhancedContainer(
width: 200,
height: 200,
color: Colors.blue,
borderRadius: BorderRadius.circular(10),
shadow: BoxShadow(
color: Colors.black.withOpacity(0.3),
blurRadius: 10,
spreadRadius: 2,
),
child: Center(
child: Text(
'Enhanced Container',
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
),
SizedBox(height: 20),
EnhancedListView(
itemCount: 20,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
onEndReached: () {
print('End reached!');
},
),
SizedBox(height: 20),
EnhancedGridView.count(
crossAxisCount: 2,
children: List.generate(20, (index) {
return Container(
color: Colors.blue,
child: Center(
child: Text(
'Item $index',
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
);
}),
onEndReached: () {
print('End reached!');
},
),
],
),
),
),
);
}
}