首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在颤振中使用来自提供者的嵌套子程序进行notifyListeners?

如何在颤振中使用来自提供者的嵌套子程序进行notifyListeners?
EN

Stack Overflow用户
提问于 2020-04-05 16:59:57
回答 3查看 2.6K关注 0票数 0

伙计们,我从“颤栗”开始,我决定做一个小游戏,比如“饼干键”来训练,但是我刚遇到了国家管理的问题.

我使用提供程序来传播"GameController“,其目的是更新播放器的资源并进行计算。

我设法在任何地方获得"GameController“,但是当我与资源(”GameController“中的对象)交互时,这个是最新的,但不在UI中,它不会改变.

main.dart:

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'controllers/GameController.dart';

void main() => runApp(MokaOnline());

class MokaOnline extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => GameController()),
      ],
      child: MokaOnlineApp(),
    );
  }
}

class MokaOnlineApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MokaOnline',
      home: Test(),
    );
  }
}

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<GameController>(
      builder: (context, gameControler, _) {
        final _mokaResource =
            gameControler.essentialResourceController.mokaResource;

        return Container(
          child: Column(
            children: <Widget>[
              Text('Moka : ${_mokaResource.getResource()}'),
              FlatButton(
                onPressed: () {
                  _mokaResource.increment();
                },
                child: Text('Add Moka'),
              )
            ],
          ),
        );
      },
    );
  }
}

GameController.dart:

代码语言:javascript
复制
import 'package:flutter/foundation.dart';
import 'package:mokaonline/controllers/EssentialResourceController.dart';

class GameController {
  EssentialResourceController _essentialResourceController =
      EssentialResourceController();

  EssentialResourceController get essentialResourceController =>
      _essentialResourceController;
}

EssentialResourceController.dart:

代码语言:javascript
复制
import 'package:mokaonline/models/essentialResources/MokaResourceModel.dart';
import 'package:mokaonline/models/essentialResources/ResourceEssentialInterface.dart';

class EssentialResourceController {
  ResourceEssentialInterface _mokaResource = MokaResourceModel();

  ResourceEssentialInterface get mokaResource => _mokaResource;
}

MokaResourceModel.dart:

代码语言:javascript
复制
import 'package:flutter/foundation.dart';
import 'package:mokaonline/models/essentialResources/ResourceEssentialInterface.dart';

class MokaResourceModel extends ChangeNotifier
    implements ResourceEssentialInterface {
  int _moka = 0;

  void increment() {
    _moka++;
    notifyListeners();
  }

  @override
  int getResource() {
    return _moka;
  }
}

我知道UI没有刷新,因为更新的不是真正的"GameController“.但我看不出如何构造否则的代码。

不管怎样,谢谢你的病人,祝你今天愉快!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-05 19:58:50

您正在寻找类似于提供程序中的嵌套对象的东西。

就像Flutter Provider Nested Objects

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => MokaResourceModel()),
        ChangeNotifierProxyProvider<MokaResourceModel, EssentialResourceController>(
            create: (_) => EssentialResourceController(),
            update: (_, moka, essR) => essR..mokaResourceModel=moka
        ),
        ChangeNotifierProxyProvider<EssentialResourceController, GameController>(
            create: (_) => GameController(),
            update: (_, essR, gamec) => gamec..essentialResourceController=essR
        )
      ],
      child: MokaOnlineApp(),
    );
  }
}

class MokaOnlineApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MokaOnline',
      home: Test(),
    );
  }
}

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<GameController>(
      builder: (context, gameControler, _) {
        final _mokaResource = gameControler.essentialResourceController.mokaResourceModel;

        return new SafeArea(
          child: Container(
            child: Column(
              children: <Widget>[
                Text('Moka : ${_mokaResource.getResource()}'),
                FlatButton(
                  onPressed: () {
                    _mokaResource.increment();
                  },
                  child: Text('Add Moka'),
                )
              ],
            ),
          ),
        );
      },
    );
  }
}

class GameController extends ChangeNotifier {

  GameController() {_EssentialResourceController = EssentialResourceController();}

  EssentialResourceController _EssentialResourceController = EssentialResourceController();

  EssentialResourceController get essentialResourceController => _EssentialResourceController;

  set essentialResourceController(EssentialResourceController value)
  {
    _EssentialResourceController = value;
    notifyListeners();
  }

}

class EssentialResourceController extends ChangeNotifier {

  EssentialResourceController() {_MokaResourceModel = MokaResourceModel();}

  MokaResourceModel _MokaResourceModel = MokaResourceModel();

  MokaResourceModel get mokaResourceModel => _MokaResourceModel;

  set mokaResourceModel(MokaResourceModel value)
  {
    _MokaResourceModel = value;
    notifyListeners();
  }

}

class MokaResourceModel extends ChangeNotifier {

  int _moka = 0;

  void increment() {
    _moka++;
    notifyListeners();
  }

  @override
  int getResource() {
    return _moka;
  }
}
票数 1
EN

Stack Overflow用户

发布于 2020-04-05 22:30:04

有些地方不对劲,但也许你发现了错误。

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => MokaResourceModel()),
        ChangeNotifierProvider(create: (context) => WoodResource()),
        ChangeNotifierProxyProvider2<MokaResourceModel, WoodResource, EssentialResourceController>(
            create: (_) => EssentialResourceController(),
            update: (_, moka, wood, essR) {
                    essR..mokaResourceModel=moka;
                    essR..woodResource=wood;
                  },
        ),
        ChangeNotifierProxyProvider<EssentialResourceController, GameController>(
            create: (_) => GameController(),
            update: (_, essR, gamec) => gamec..essentialResourceController=essR
        )
      ],
      child: MokaOnlineApp(),
    );
  }
}

class MokaOnlineApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MokaOnline',
      home: Test(),
    );
  }
}

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {


    return Consumer<GameController>(
      builder: (context, gameControler, _) {
        final _moka = gameControler.essentialResourceController.mokaResourceModel;
        final _wood = gameControler.essentialResourceController.woodResource;

        return new SafeArea(
          child: Container(
            child: Column(
              children: <Widget>[
                Text('Moka : ${_moka.getResource()}'),
                FlatButton(
                  onPressed: () {
                    _moka.increment();
                  },
                  child: Text('Add Moka'),
                ),
                new Container(height: 100.0,),
                Text('Wood : ${_wood.getResource()}'),
                FlatButton(
                  onPressed: () {
                    _wood.increment();
                  },
                  child: Text('Add Wood'),
                )
              ],
            ),
          ),
        );
      },
    );
  }
}

class GameController extends ChangeNotifier {

  GameController() {_EssentialResourceController = EssentialResourceController();}

  EssentialResourceController _EssentialResourceController = EssentialResourceController();

  EssentialResourceController get essentialResourceController => _EssentialResourceController;

  set essentialResourceController(EssentialResourceController value)
  {
    _EssentialResourceController = value;
    notifyListeners();
  }

}

class EssentialResourceController extends ChangeNotifier {

  EssentialResourceController() {
    _MokaResourceModel = MokaResourceModel();
    _WoodResource = WoodResource();
  }

  MokaResourceModel _MokaResourceModel = MokaResourceModel();
  MokaResourceModel get mokaResourceModel => _MokaResourceModel;

  set mokaResourceModel(MokaResourceModel value)
  {
    _MokaResourceModel = value;
    notifyListeners();
  }

  WoodResource _WoodResource = WoodResource();
  WoodResource get woodResource => _WoodResource;
  set woodResource(WoodResource value)
  {
    _WoodResource = value;
    notifyListeners();
  }

}

class MokaResourceModel extends ChangeNotifier {

  int _moka = 0;

  void increment() {
    _moka++;
    notifyListeners();
  }

  @override
  int getResource() {
    return _moka;
  }
}

class WoodResource extends ChangeNotifier {

  int _wood = 0;

  void increment() {
    _wood++;
    notifyListeners();
  }

  @override
  int getResource() {
    return _wood;
  }

}
票数 0
EN

Stack Overflow用户

发布于 2020-04-05 22:37:47

这也不是真的更好

代码语言:javascript
复制
ChangeNotifierProvider(create: (context) => MokaResourceModel()),
        ChangeNotifierProvider(create: (context) => WoodResource()),
        ChangeNotifierProxyProvider<MokaResourceModel, EssentialResourceController>(
            key: UniqueKey(),
            create: (_) => EssentialResourceController(),
            update: (_, moka, essR) => essR..mokaResourceModel=moka
        ),
        ChangeNotifierProxyProvider<WoodResource, EssentialResourceController>(
          key: UniqueKey(),
            create: (_) => EssentialResourceController(),
            update: (_, wood, essR) => essR..woodResource=wood
        ),
        ChangeNotifierProxyProvider<EssentialResourceController, GameController>(
            create: (_) => GameController(),
            update: (_, essR, gamec) => gamec..essentialResourceController=essR
        )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61046213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档