Dart 颤振admob show()方法重新构建/&引用;页

Dart 颤振admob show()方法重新构建/&引用;页,dart,admob,flutter,Dart,Admob,Flutter,我写了一个非常简单的应用程序来尝试“admob”插件。但是,我有一个关于\u bannarad..load()…show()的问题 我运行应用程序首先打开Home()类,然后按下按钮打开其他屏幕(StateAdeExample)。然后,当我按SHOW BANNER按钮时,它会显示我的横幅,但在admob再次重建我的主页()之前,它会显示StateAdeExample()。我可以看到我的打印(“----/”)在App.dart中 我只想重新构建我的StateAdeExample类() App.da

我写了一个非常简单的应用程序来尝试“admob”插件。但是,我有一个关于
\u bannarad..load()…show()的问题

我运行应用程序首先打开Home()类,然后按下按钮打开其他屏幕(StateAdeExample)。然后,当我按SHOW BANNER按钮时,它会显示我的横幅,但在admob再次重建我的主页()之前,它会显示StateAdeExample()。我可以看到我的
打印(“----/”)在App.dart中

我只想重新构建我的StateAdeExample类()

App.dart

Route routes(RouteSettings settings) {
switch (settings.name) {
  case "/":
    return MaterialPageRoute(
        settings: settings,
        maintainState: true,
        builder: (BuildContext context) {
          print("----- /");
          return Home();
        });
    break;
  case "/stateAdExapmle":
    return MaterialPageRoute(
        settings: settings,
        builder: (BuildContext context) {
          print("----- /stateAdExapmle");
          return StateAdExample();
        });
    break;
  default:
    return null;
}}
霍姆·达特

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ScopedModelDescendant(
          rebuildOnChange: false,
          builder: (BuildContext context, Widget widget, AdScoped model) {
            return Column(
              children: <Widget>[
                RaisedButton(
                  child: Text("2.Screen"),
                  onPressed: () {
                    Navigator.pushNamed(context, "/stateAdExapmle");
                  },
                ),
              ],
            );
          }),
    );
  }
}
class Home扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:ScopedModelSchendant(
重建改变:错误,
生成器:(BuildContext上下文、小部件小部件、AdScoped模型){
返回列(
儿童:[
升起的按钮(
子项:文本(“2.屏幕”),
已按下:(){
Navigator.pushNamed(上下文,“/stateAdExapmle”);
},
),
],
);
}),
);
}
}
StateAdeExample.dart

const String testDevice = 'YOUR_DEVICE_ID';

class StateAdExample extends StatefulWidget {
  @override
  _StateAdExapmleState createState() => _StateAdExapmleState();
}

class _StateAdExapmleState extends State<StateAdExample> {
  static final MobileAdTargetingInfo targetingInfo = new MobileAdTargetingInfo(
    testDevices: testDevice != null ? <String>[testDevice] : null,
    keywords: <String>['foo', 'bar'],
    contentUrl: 'http://foo.com/bar.html',
    birthday: new DateTime.now(),
    childDirected: true,
    gender: MobileAdGender.male,
    nonPersonalizedAds: true,
  );

  BannerAd _bannerAd;

  BannerAd createBannerAd() {
    return new BannerAd(
      adUnitId: BannerAd.testAdUnitId,
      size: AdSize.banner,
      targetingInfo: targetingInfo,
      listener: (MobileAdEvent event) {
        print("BannerAd event $event");
      },
    );
  }

  @override
  void initState() {
    super.initState();
    FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId);
    _bannerAd = createBannerAd()..load();
  }

  @override
  void dispose() {
    _bannerAd?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: <Widget>[
          RaisedButton(
              child: const Text('SHOW BANNER'),
              onPressed: () {
                _bannerAd ??= createBannerAd();
                _bannerAd
                  ..load()
                  ..show();
              }),
          RaisedButton(
              child: const Text('REMOVE BANNER'),
              onPressed: () {
                _bannerAd?.dispose();
                _bannerAd = null;
              }),
        ],
      ),
    );
  }
}
const String testDevice='YOUR_DEVICE_ID';
类stateExample扩展StatefulWidget{
@凌驾
_StateAdExapmleState createState()=>_StateAdExapmleState();
}
类_StateAdExapmleState扩展状态{
静态最终MobileAdTargetingInfo targetingInfo=新MobileAdTargetingInfo(
testDevices:testDevice!=null?[testDevice]:null,
关键词:['foo','bar'],
contentUrl:'http://foo.com/bar.html',
生日:新的日期时间。现在(),
对,,
性别:MobileAdGender.male,
非人格化爸爸:没错,
);
班纳拉德(BannerAd);;
BannerAd createBannerAd(){
返回新的横幅(
adUnitId:BannerAd.testAdUnitId,
大小:AdSize.banner,
targetingInfo:targetingInfo,
侦听器:(MobileAdEvent事件){
打印(“BannerAd事件$event”);
},
);
}
@凌驾
void initState(){
super.initState();
FirebaseAdMob.instance.initialize(appId:FirebaseAdMob.testAppId);
_bannerAd=createBannerAd()…load();
}
@凌驾
无效处置(){
_bannerAd?.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:专栏(
儿童:[
升起的按钮(
子项:常量文本('SHOW BANNER'),
已按下:(){
_bannerAd???=createBannerAd();
_班纳拉德
…加载()
…显示();
}),
升起的按钮(
子项:const Text('REMOVE BANNER'),
已按下:(){
_bannerAd?.dispose();
_bannerAd=null;
}),
],
),
);
}
}

如何解决此问题?

这很正常,没有问题problem@RémiRousselet这可能是正常的,但我的fetch()或其他数据函数在每次生成时都会再次运行,因此我遇到了这个问题。请参阅@RémiRousselet非常感谢,这是一篇非常好的帖子。@RémiRousselet我想再问一件事,我使用的是作用域模型,因此没有initState()函数。如何将其移出build()方法或scopedModelSecondant()方法。