0

私のアプリには、実行するアクションについてユーザーに通知するだけの導入機能があります。問題は、このヘルプ アクション テキスト ( ) が、関数が呼び出されContainer(...)たときに削除されないことです。setState()

プロセスの論理的概要:

-> `User launches app` 
    |-> `login` 
    |-> `show main UI (with help action if first time launch)` 
        |-> first time launch ? show help text : don't show
             | User acknowledges help text, set in preferences

以下は、ダーツ フラグメントのコード スニペットです。

UiHomePage (メイン UI - これは親 UI)

class HomePage extends StatefulWidget {
  const HomePage({Key key}) : super(key: key);

  @override
  _HomePage createState() => _HomePage();
}

class _HomePage extends State<HomePage> {

  @override
  Widget build(BuildContext context) {
    
    Widget pageDashboardUser() {
      ...
      
      // Notify UiComponentPartnerSelector if we should show help action text based on AppSharedPreferences().isFirstTap()
      Widget middleBrowseCard() {
        return new FutureBuilder(
            builder: (context, snapshot) {
              return UiComponentPartnerSelector(
                  _displayProfiles, snapshot.data);
            },
            future: AppSharedPreferences().isFirstTap());
      }

      var search = topSearch();
      var selector = middleBrowseCard();

      return Stack(
        children: [search, selector],
      );

    return Scaffold(...)
}

このウィジェットには、基本カード、テキスト オーバーレイ、およびヒント テキスト コンポーネントを含む一連のプロファイルが表示されます。

主な焦点は、ヒント コンポーネントまたは空のコンテナーを返し、最後にカードのonclickイベントを処理するshowHintコンストラクターでの定義です (アプリが初めて起動された場合は true) 。showTapTutorial()_onTap(Profile)

UiComponentPartnerSelector (サブ UI - ヘルプ テキストがここに表示されます

class UiComponentPartnerSelector extends StatefulWidget {
  bool showHint;
  final List<Profile> items;

  UiComponentPartnerSelector(this.items, this.showHint, {Key key})
      : super(key: key);

  @override
  _UiComponentPartnerSelector createState() => _UiComponentPartnerSelector();
}

class _UiComponentPartnerSelector extends State<UiComponentPartnerSelector> {
  UiComponentCard _activeCard;
  int _tappedImageIndex = 0;

  Widget showTapTutorial() {
    if (!widget.showHint) {
      return Container();
    }

    return Container(
      padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 32),
      decoration: BoxDecoration(
        color: Colors.white.withOpacity(0.6),
        borderRadius: BorderRadius.all(Radius.circular(5)),
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Icon(
            Icons.touch_app,
            color: Colors.black.withOpacity(0.6),
          ),
          Text(
            "Touch to view partner profile",
            textAlign: TextAlign.center,
            style: TextStyle(color: Colors.black),
          )
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    Color _standard = Colors.white;
    //
    // _cache = widget.items.map((e) => {
    //     e.imageUri.toString(),
    //     Image.network(e.imageUri.toString())
    // });

    Future _onTap(Profile e) async {
      if (!widget.showHint) {
        Navigator.of(context)
            .push(MaterialPageRoute(builder: (context) => UiViewProfile(e)));
      } else {
        AppSharedPreferences().setFirstTap(false).then((value) {
          setState(() {
            widget.showHint = false;
          });
        });
      }
    }
    
    UiComponentCard createComponentCard(Profile e) {
        ...
        return UiComponentCard(
            onTap: () {
              _onTap(e);
            },
            wImage: Center(
              child: Image.network(
                e.profileImageLink.toString(),
                fit: BoxFit.fill,
              ),
            ),
            wContent:
                // Center(
                //   child: UiTextLine(text: e.displayName),
                // ),
                Column(
              children: [
                topBasicInfo(),
                Expanded(child: Container()),
                showTapTutorial(),
                Expanded(child: Container()),
                bottomBio()
              ],
            ),
          );
        }

    return Container(
        child: Stack(...)
    );

問題:

_onTap(Profile)をクリックするとshowHintですtrue

何が起こるべきか:

次に行うべきことはAppSharedPreferences().setFirstTap(false)、最初のタップ フラグをに設定し、false終了したら に設定してから、UI を再レンダリングし、ヒント テキスト コンテナ ( にあります) を削除することです。setState()showHintfalseshowTapTutorial()

何が起こるのですか:

が呼び出されたときに実際に何が起こるかは_onTap()、設定​​を正しく更新し、setState()呼び出されshowHint == falseてtrue を返しますが、UI 自体は再レンダリングされません。!widget.showHintshowTapTutorial()Container()

したがって、この「ボタン」を初めてクリックした後、UI は残ります (変更されません)。もう一度クリックすると、アクション ヘルプ テキスト (チュートリアル) がまだ表示されているNavigator.of(context).push(MaterialPageRoute(builder: (context) => UiViewProfile(e)));にパーツが実行されます。同じカードをもう一度クリックすると

私は何かを見逃していますか、何か間違っていますか?

4

0 に答える 0