Database 如何在Flatter中的不同应用程序页面之间正确共享对象
我是个新手。我实现了一个任意类,它有一些状态,需要在Flutter的不同页面之间共享。我目前正在做的是定义一个Database 如何在Flatter中的不同应用程序页面之间正确共享对象,database,flutter,dart,Database,Flutter,Dart,我是个新手。我实现了一个任意类,它有一些状态,需要在Flutter的不同页面之间共享。我目前正在做的是定义一个sqflite数据库帮助程序,每个页面从数据库加载该对象,在转到其他页面之前,它会再次将其保存到数据库并导航到其他页面。然而,它增加了许多复杂性和bug 另一种可能的解决方案是将其添加到myApp()类中,该类在main()函数中调用。但是,由于其他页面不继承myApp(),因此它们无法访问global\u对象 类MyApp扩展了无状态小部件{ //我需要gloabl_对象在不同的页面访
sqflite
数据库帮助程序,每个页面从数据库加载该对象,在转到其他页面之前,它会再次将其保存到数据库并导航到其他页面。然而,它增加了许多复杂性和bug
另一种可能的解决方案是将其添加到myApp()
类中,该类在main()
函数中调用。但是,由于其他页面不继承myApp()
,因此它们无法访问global\u对象
类MyApp扩展了无状态小部件{
//我需要gloabl_对象在不同的页面访问
//---------------------------------------------------
MyObject全局对象;
//---------------------------------------------------
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“应用程序标题”,
debugShowCheckedModeBanner:false,
主题:新主题数据(
//应用程序主题
),
//主页:主页(),
路由:{//定义路由
//需要访问全局对象的不同页面
},
);
}
方法1:使用包获取它
简单直接服务定位器
,允许将接口与具体实现分离,并从应用程序中的任何位置访问具体实现。
示例
GetIt sl=GetIt.instance;
void main(){
sl.registerSingleton
完整示例
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
//提供多个对象时,使用MultiProvider很方便。
回程多供应商(
供应商:[
//在这个示例应用程序中,CatalogModel从未更改,因此一个简单的提供者
//这就足够了。
提供程序(创建:(上下文)=>CatalogModel()),
//CartModel作为ChangeNotifier实现,它调用
//此外,CartModel依赖于
//在CatalogModel上,因此需要代理提供程序。
ChangeNotifierProxyProvider(
create:(context)=>CartModel.empty(),
更新:(上下文、目录、以前的购物车)=>
CartModel(目录,以前的Cart),
),
],
孩子:MaterialApp(
标题:“提供商演示”,
主题:appTheme,
initialRoute:“/”,
路线:{
“/”:(上下文)=>MyCatalog(),
“/cart”:(上下文)=>MyCart(),
},
),
);
}
}
使用Provider.of(上下文);
class\u CartList扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
var itemNameStyle=Theme.of(context).textTheme.title;
var cart=Provider.of(上下文);
返回ListView.builder(
itemCount:cart.items.length,
或使用消费者
class\u cartotal扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
var hugeStyle=Theme.of(context.textTheme.display4.copyWith(fontSize:48);
返回大小框(
身高:200,
儿童:中心(
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
消费者(
生成器:(上下文、购物车、子项)=>
文本(“\${cart.totalPrice}”,样式:hugeStyle)),
方法1:使用包获取它
简单直接服务定位器
,允许将接口与具体实现分离,并从应用程序中的任何位置访问具体实现。
示例
GetIt sl=GetIt.instance;
void main(){
sl.registerSingleton
完整示例
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
//提供多个对象时,使用MultiProvider很方便。
回程多供应商(
供应商:[
//在这个示例应用程序中,CatalogModel从未更改,因此一个简单的提供者
//这就足够了。
提供程序(创建:(上下文)=>CatalogModel()),
//CartModel作为ChangeNotifier实现,它调用
//此外,CartModel依赖于
//在CatalogModel上,因此需要代理提供程序。
ChangeNotifierProxyProvider(
create:(context)=>CartModel.empty(),
更新:(上下文、目录、以前的购物车)=>
CartModel(目录,以前的Cart),
),
],
孩子:MaterialApp(
标题:“提供商演示”,
主题:appTheme,
initialRoute:“/”,
路线:{
“/”:(上下文)=>MyCatalog(),
“/cart”:(上下文)=>MyCart(),
},
),
);
}
}
使用Provider.of(上下文);
class\u CartList扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
var itemNameStyle=Theme.of(context).textTheme.title;
var cart=Provider.of(上下文);
返回ListView.builder(
itemCount:cart.items.length,
或使用消费者
class\u cartotal扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
var hugeStyle=Theme.of(context.textTheme.display4.copyWith(fontSize:48);
返回大小框(
身高:200,
儿童:中心(
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
消费者(
生成器:(上下文、购物车、子项)=>
文本(“\${cart.totalPrice}”,样式:hugeStyle)),
让我稍后为您省去一些麻烦。不要声明全局对象。使用类似provider或get_it的软件包。稍后您会感谢我。让我稍后为您省去一些麻烦。不要声明全局对象。使用
GetIt sl = GetIt.instance;
void main() {
sl.registerSingleton<AppModel>(AppModelImplementation());
runApp(MyApp());
}
var myAppModel = sl.get<AppModel>();
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Using MultiProvider is convenient when providing multiple objects.
return MultiProvider(
providers: [
// In this sample app, CatalogModel never changes, so a simple Provider
// is sufficient.
Provider(create: (context) => CatalogModel()),
// CartModel is implemented as a ChangeNotifier, which calls for the use
// of ChangeNotifierProvider. Moreover, CartModel depends
// on CatalogModel, so a ProxyProvider is needed.
ChangeNotifierProxyProvider<CatalogModel, CartModel>(
create: (context) => CartModel.empty(),
update: (context, catalog, previousCart) =>
CartModel(catalog, previousCart),
),
],
child: MaterialApp(
title: 'Provider Demo',
theme: appTheme,
initialRoute: '/',
routes: {
'/': (context) => MyCatalog(),
'/cart': (context) => MyCart(),
},
),
);
}
}
class _CartList extends StatelessWidget {
@override
Widget build(BuildContext context) {
var itemNameStyle = Theme.of(context).textTheme.title;
var cart = Provider.of<CartModel>(context);
return ListView.builder(
itemCount: cart.items.length,
class _CartTotal extends StatelessWidget {
@override
Widget build(BuildContext context) {
var hugeStyle = Theme.of(context).textTheme.display4.copyWith(fontSize: 48);
return SizedBox(
height: 200,
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<CartModel>(
builder: (context, cart, child) =>
Text('\$${cart.totalPrice}', style: hugeStyle)),