私のアプリには、実行するアクションについてユーザーに通知するだけの導入機能があります。問題は、このヘルプ アクション テキスト ( ) が、関数が呼び出され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()
showHint
false
showTapTutorial()
何が起こるのですか:
が呼び出されたときに実際に何が起こるかは_onTap()
、設定を正しく更新し、setState()
呼び出されshowHint == false
てtrue を返しますが、UI 自体は再レンダリングされません。!widget.showHint
showTapTutorial()
Container()
したがって、この「ボタン」を初めてクリックした後、UI は残ります (変更されません)。もう一度クリックすると、アクション ヘルプ テキスト (チュートリアル) がまだ表示されている間Navigator.of(context).push(MaterialPageRoute(builder: (context) => UiViewProfile(e)));
にパーツが実行されます。同じカードをもう一度クリックすると
私は何かを見逃していますか、何か間違っていますか?