From 2c78380c8d72d9250e161437feace2263e03cecf Mon Sep 17 00:00:00 2001 From: Gregory Bleiker Date: Mon, 30 Dec 2024 15:56:35 +0100 Subject: [PATCH 1/3] first version of delayed update --- samples/delayed_update/deps.edn | 6 ++++ .../src/sample/delayed_update.cljd | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 samples/delayed_update/deps.edn create mode 100644 samples/delayed_update/src/sample/delayed_update.cljd diff --git a/samples/delayed_update/deps.edn b/samples/delayed_update/deps.edn new file mode 100644 index 00000000..ac865000 --- /dev/null +++ b/samples/delayed_update/deps.edn @@ -0,0 +1,6 @@ +{:paths ["src"] ; where your cljd files are + :deps {org.clojure/clojure {:mvn/version "1.10.1"} + tensegritics/clojuredart {:local/root "../../"}} + :aliases {:cljd {:main-opts ["-m" "cljd.build"]}} + :cljd/opts {:main sample.delayed-update + :kind :flutter}} diff --git a/samples/delayed_update/src/sample/delayed_update.cljd b/samples/delayed_update/src/sample/delayed_update.cljd new file mode 100644 index 00000000..7951cdf0 --- /dev/null +++ b/samples/delayed_update/src/sample/delayed_update.cljd @@ -0,0 +1,35 @@ +(ns sample.delayed-update + "Different versions of updating from futures" + (:require ["package:flutter/material.dart" :as m] + [cljd.flutter :as f])) + +(defonce my-result (atom [])) + +(defn my-delayed-fn [x] (Future/delayed (Duration .seconds 3) (fn [] (str " is working!")))) + +;(defonce my-other-list data/my-delayed-list) + +(defn wait-for-result! [] (reset! my-list (await (data/my-delayed-fn "wait-for-result!")))) + +(defn main [] + (f/run + (m/MaterialApp + .title "Delayed Update Demo") + .home + (m/Scaffold + .appBar (m/AppBar .title (m/Text "Delayed Update"))) + .body + m/Center + (f/widget + :watch [listdata my-list] + (m/Column .children + [(m/ElevatedButton + .child (m/Text "Using reset!") + .onPressed (fn [] (reset! my-list (await (data/my-delayed-fn "reset!"))) nil)) + (m/ElevatedButton + .child (m/Text "swap") + .onPressed (fn [] (let [v (await (data/my-delayed-fn "swap"))] (swap! my-list (fn [_] v))) nil)) + (m/ElevatedButton + .child (m/Text "delayed fn") + .onPressed (fn [] (wait-for-result!) nil)) + (m/Text my-result)])))) From f16ac06bf339057822b2cf7054b9f59cc6eeef01 Mon Sep 17 00:00:00 2001 From: Gregory Bleiker Date: Mon, 30 Dec 2024 16:19:13 +0100 Subject: [PATCH 2/3] added comments, fixed namespaces --- samples/README.md | 4 +++ .../src/sample/delayed_update.cljd | 25 +++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/samples/README.md b/samples/README.md index c32d823b..1a267a4a 100644 --- a/samples/README.md +++ b/samples/README.md @@ -38,6 +38,10 @@ A native application will be created. If you want to test it on mobile, please f - SingleChildScrollView - DataTable +### [Delayed update](./delayed_update) +- state with `:watch` + +- Updating state from a Future ### [Drawer](./drawer) - stateless diff --git a/samples/delayed_update/src/sample/delayed_update.cljd b/samples/delayed_update/src/sample/delayed_update.cljd index 7951cdf0..deb1e775 100644 --- a/samples/delayed_update/src/sample/delayed_update.cljd +++ b/samples/delayed_update/src/sample/delayed_update.cljd @@ -3,13 +3,13 @@ (:require ["package:flutter/material.dart" :as m] [cljd.flutter :as f])) -(defonce my-result (atom [])) +(defonce my-result (atom "")) -(defn my-delayed-fn [x] (Future/delayed (Duration .seconds 3) (fn [] (str " is working!")))) +(defn my-delayed-fn + "a sample function that returns a dart future" + [x] (Future/delayed (Duration .seconds 1) (fn [] (str x " is working!")))) -;(defonce my-other-list data/my-delayed-list) - -(defn wait-for-result! [] (reset! my-list (await (data/my-delayed-fn "wait-for-result!")))) +(defn wait-for-result! [] (reset! my-result (await (my-delayed-fn "wait-for-result!")))) (defn main [] (f/run @@ -21,15 +21,20 @@ .body m/Center (f/widget - :watch [listdata my-list] + :watch [r my-result] (m/Column .children - [(m/ElevatedButton + [ + ;; using reset! + (m/ElevatedButton .child (m/Text "Using reset!") - .onPressed (fn [] (reset! my-list (await (data/my-delayed-fn "reset!"))) nil)) + .onPressed (fn [] (reset! my-result (await (my-delayed-fn "reset!"))) nil)) + ;; using swap! + ;; this is a bit contrieved because there's no reason to not use reset! here (m/ElevatedButton .child (m/Text "swap") - .onPressed (fn [] (let [v (await (data/my-delayed-fn "swap"))] (swap! my-list (fn [_] v))) nil)) + .onPressed (fn [] (let [v (await (my-delayed-fn "swap!"))] (swap! my-result (fn [_] v))) nil)) + ;; using a function that swaps out the atom elsewhere (m/ElevatedButton .child (m/Text "delayed fn") .onPressed (fn [] (wait-for-result!) nil)) - (m/Text my-result)])))) + (m/Text r)])))) From a039aed87cc1cf70341acb548e7735dbe5694fc5 Mon Sep 17 00:00:00 2001 From: Gregory Bleiker Date: Mon, 30 Dec 2024 16:26:31 +0100 Subject: [PATCH 3/3] fixed typo --- samples/delayed_update/src/sample/delayed_update.cljd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/delayed_update/src/sample/delayed_update.cljd b/samples/delayed_update/src/sample/delayed_update.cljd index deb1e775..cd955287 100644 --- a/samples/delayed_update/src/sample/delayed_update.cljd +++ b/samples/delayed_update/src/sample/delayed_update.cljd @@ -29,7 +29,7 @@ .child (m/Text "Using reset!") .onPressed (fn [] (reset! my-result (await (my-delayed-fn "reset!"))) nil)) ;; using swap! - ;; this is a bit contrieved because there's no reason to not use reset! here + ;; this is a bit contrived because there's no reason to not use reset! here (m/ElevatedButton .child (m/Text "swap") .onPressed (fn [] (let [v (await (my-delayed-fn "swap!"))] (swap! my-result (fn [_] v))) nil))