[英]Redraw widget with Delay in Flutter
我想根據條件邏輯從窗口小部件中刪除內容。
下面是我的小部件樹,
return MaterialApp(
home: Scaffold(
body: Container(
margin: EdgeInsets.all(120.0),
child: Align(
alignment: Alignment.center,
child: Column(
children: <Widget>[
Text("Loading...");
],
),
),
),
));
可以說我有一個變量,該變量從SharePreferences中獲取值,如果該值是“ Hide”,則必須隱藏封裝在其中的Text小部件。 否則,它將顯示從SP獲取的文本。
這里要注意的是,文本最初將在特定持續時間內顯示“正在加載...”,然后在此之后必須根據條件動態地運行。
我已經嘗試過使用Timer
和setState()
但無法真正使其工作。 如果有人對此有解決方案,請提供幫助。
喬丹·戴維斯是對的。 您需要一個FutureBuilder
或StreamBuilder
。
return MaterialApp(
home: Scaffold(
body: Container(
margin: EdgeInsets.all(120.0),
child: Center(
child: FutureBuilder(
future: Future.delayed(Duration(seconds: 3)),
builder: (c, s) => s.connectionState == ConnectionState.done
? Text("Loaded")
: Text("Loading..."))),
),
));
只需將Future.delayed
替換為您的函數即可。
我終於找到了將@ olexa.le的Future.Delayed
方法與一些修改結合在一起的解決方案。
main() {
runApp(MyPrimaryWidgetBuilder());
Future.delayed(const Duration(seconds: 5), () async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
String appRunStatus = sharedPreferences.getString("appStartStatus");
if( appRunStatus == null || appRunStatus == "" ){
//Redraw new Widget
}
}
現在,我的第一個Widget將被繪制到視口,然后由於Future
設置的延遲, main()
方法將等待5秒。 然后條件塊將檢查sharedPreferences.getString()
返回的值
如果該值為NULL,那么我的目標是繪制一個新的小部件來替換現有的小部件。 在條件模塊內部,我只是使用新的小部件再次調用runApp()
方法。
if( appRunStatus == null || appRunStatus == "" ){
runApp(
new MaterialApp(
home: Scaffold(
body: Container(
child: Text("You Are running the app for the first time..."),
),
),
);
}
假定最初顯示的布局將包含文本“正在加載...”,並且將保持原樣5秒鍾。 根據SharePreferences返回的值5秒鍾后,將使用新的小部件重新繪制整個應用程序的視圖。
我已經重繪了大約6個新的小部件,並且還包含了一些適合我的用例的動畫。 Text
小部件只是一個示例,您可以將其替換為所需的任何名稱,這將起作用。 它適用於重新繪制帶有新子代的窗口小部件而無需導航到新頁面。
這對我很有用,如果有更好的解決方案可以更有效地實現相同目標,那么請分享一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.