You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:实现ElevatedButton文本从字符串转递增整数的方法

实现Flutter激励广告按钮动态文本切换

核心解决方案

通过判断奖励分数的状态动态切换按钮文本,同时保证广告观看后的分数递增逻辑正确,以下是完整实现:

完整代码

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

class RewardedAdPage extends StatefulWidget {
  const RewardedAdPage({super.key});

  @override
  State<RewardedAdPage> createState() => _RewardedAdPageState();
}

class _RewardedAdPageState extends State<RewardedAdPage> {
  RewardedAd? _rewardedAd;
  int _rewardedScore = 0;

  @override
  void initState() {
    super.initState();
    _createRewardedAd();
  }

  void _createRewardedAd() {
    RewardedAd.load(
      adUnitId: 'ca-app-pub-3940256099942544/5224354917',
      request: const AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
        onAdLoaded: (RewardedAd ad) {
          print('$ad loaded.');
          setState(() => _rewardedAd = ad);
        },
        onAdFailedToLoad: (LoadAdError error) {
          print('RewardedAd failed to load: $error');
          setState(() => _rewardedAd = null);
        },
      ),
    );
  }

  void _showRewardedAd() {
    if (_rewardedAd == null) return;

    _rewardedAd!.fullScreenContentCallback = FullScreenContentCallback(
      onAdShowedFullScreenContent: (RewardedAd ad) =>
          print('$ad onAdShowedFullScreenContent.'),
      onAdDismissedFullScreenContent: (RewardedAd ad) {
        print('$ad onAdDismissedFullScreenContent.');
        ad.dispose();
        _createRewardedAd();
      },
      onAdFailedToShowFullScreenContent: (RewardedAd ad, AdError error) {
        print('$ad onAdFailedToShowFullScreenContent: $error');
        ad.dispose();
        _createRewardedAd();
      },
      onAdImpression: (RewardedAd ad) => print('$ad impression occurred.'),
    );

    _rewardedAd!.show(
      onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {
        setState(() => _rewardedScore += 10);
      },
    );

    _rewardedAd = null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Rewarded:  $_rewardedScore'),
        centerTitle: true,
      ),
      body: Center(
        child: ElevatedButton(
          child: Text(
            // 动态切换按钮文本:初始显示"show ad",获得奖励后显示"+分数"
            _rewardedScore == 0 ? "show ad" : "+$_rewardedScore",
            style: const TextStyle(fontSize: 30),
          ),
          // 广告未加载完成时禁用按钮,避免无效点击
          onPressed: _rewardedAd != null ? _showRewardedAd : null,
        ),
      ),
    );
  }
}

关键修改说明

  • 动态文本切换:通过三元表达式_rewardedScore == 0 ? "show ad" : "+$_rewardedScore"实现初始状态与奖励状态的文本切换,完全匹配需求。
  • 广告状态校验:在按钮onPressed中加入_rewardedAd != null的判断,防止用户点击未加载完成的广告,优化交互体验。
  • 分数递增逻辑:用_rewardedScore += 10简化分数更新代码,确保每次观看广告后分数正确递增10。
  • 广告生命周期管理:保留原有广告加载、销毁的逻辑,保证广告资源合理释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Saad Mansoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:25:55