Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在Flatter中的不同应用程序页面之间正确共享对象_Database_Flutter_Dart - Fatal编程技术网

Database 如何在Flatter中的不同应用程序页面之间正确共享对象

Database 如何在Flatter中的不同应用程序页面之间正确共享对象,database,flutter,dart,Database,Flutter,Dart,我是个新手。我实现了一个任意类,它有一些状态,需要在Flutter的不同页面之间共享。我目前正在做的是定义一个sqflite数据库帮助程序,每个页面从数据库加载该对象,在转到其他页面之前,它会再次将其保存到数据库并导航到其他页面。然而,它增加了许多复杂性和bug 另一种可能的解决方案是将其添加到myApp()类中,该类在main()函数中调用。但是,由于其他页面不继承myApp(),因此它们无法访问global\u对象 类MyApp扩展了无状态小部件{ //我需要gloabl_对象在不同的页面访

我是个新手。我实现了一个任意类,它有一些状态,需要在Flutter的不同页面之间共享。我目前正在做的是定义一个
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)),