Tech Showcases,
Developer Resources &
Partners
droidcon News
Building Multiplatform Mobile Apps in Kotlin
Speaker: Russel Wolf
Source: droidcon Online 2020
Multiplatform Series Webinar (Part 1 of 3)
Transcript
en-us
00:00
Gerty thanks very much so yeah I'm
00:06
Russell wolf I'm a multi-block from
00:09
engineer at clutch late I go in touch
00:12
lab in this past February um after
00:16
hadn't been doing mostly bought some
00:18
stuff for a little over two years
00:20
especially funny Greg you were talking
00:22
about the the like initial release of
00:26
multi-platform in in 2017 so that like
00:31
that that like first released I was
00:33
concurrent with with cotton 1.2 was just
00:36
um JVM and JavaScript because because
00:40
cotton native was still kind of in in
00:42
early development at that point and it
00:46
became possible to do like con carne de
00:49
got like added to multi platform in
00:51
February of 2018 and I was looking back
00:56
at my get history recently um and I
01:00
guess I like did my first like wrote my
01:03
first code in but wrote my first month
01:06
on code the day after that release so I
01:11
jumped in pretty early so and and that
01:16
that was not quite yet though I really
01:18
did but but um one of my projects they
01:21
still need teen was almost about from
01:23
settings library um so yeah that's
01:28
that's a few notes ago me let's talk a
01:36
little bit uncommon so Carlos gave up
01:40
pretty good kind of interruption to my
01:44
work so I don't want to we keep those
01:47
details do too much um but it's a quick
01:50
summary so caught multi-platform in
01:54
takes takes the different levels of
01:56
outland unless you compile but from but
01:59
gnostic code to multiple different
02:02
targets so that might be JVM which is is
02:05
Android or or like server-side Java
02:08
JavaScript which might be browser or
02:11
might be node who are native
02:14
might be desktop native and that it or
02:18
iOS and then even use black or acidic
02:24
code to to talk to the eyes of those
02:27
individual platforms and like we're all
02:30
very used to the the smooth JPN Interop
02:32
that that cotton has on the on the top
02:35
and the Android side and you have you
02:38
have similar interrupt with the platform
02:40
api's of whichever of the platform
02:42
you're on from your platform good and
02:47
one thing I do want to know there is cuz
02:48
up I did see a question go by on it from
02:52
the first talk so you you can do expect
02:56
the actual on to uh to talk between your
02:60
your comment and your platform code and
03:02
in a lot of cases it can be nice and it
03:05
can do certain things that interfaces
03:06
can't like like having expect
03:08
instructors or expect a little functions
03:11
but one of the disadvantages sometimes
03:14
is expecting actual is forced by the
03:19
compiler to be one-to-one relationship
03:22
so there is exactly one actual
03:25
declaration per platform for each expect
03:27
declaration and one of the that doesn't
03:30
have to sometimes of that is it's you
03:32
can't swatch Swift that out for in your
03:34
custom so sometimes it can be nice to
03:37
still stick to old-fashioned interfaces
03:39
because it lets you like a passing a
03:41
test mark instead and yet the other
03:47
point I wanna make is some of them is
03:50
very well suited to to normal at farms
03:55
in radicular so like yes you can even
03:57
share between between any of these
03:58
people at forums but they provide um but
04:02
one of the things that's nice about
04:03
mobile is to your users like Android iOS
04:07
are roughly the same thing and like yes
04:10
under the hood they're doing lots of
04:11
things but um there's a lot of
04:14
opportunities to share code between
04:16
mobile Android iOS apps because they're
04:20
probably going to be doing the same
04:21
thing because your users and like your
04:24
beer crunch matters and so if you
04:27
usually want
04:30
and I'm not going to one saying this the
04:34
difference when but Mexico's Mountain
04:38
Coffee launched this like Colin for
04:41
cross-platform mobile development page
04:43
to say you know like their interest also
04:47
in in pushing this use case as like one
04:50
of the key cases well not the platform
04:52
I mean yeah I really think it is the one
04:56
of the best ones but of course uh like
05:03
it's it but that's all I say like how do
05:05
you actually like I started with it so
05:08
yeah this gives it give us a great
05:09
introduction but one of the things that
05:13
you can find if you if you've been had
05:15
upon in this case for a while is like
05:19
Colin went over the last two years has
05:21
been a bit of a moving target like the
05:24
best practices involved the tooling has
05:27
changed dramatically from what it was
05:29
two years ago and it's like it's gotten
05:32
a lot more stable easily than than it
05:34
was early on in terms of breaking change
05:36
things happening but there's still a lot
05:38
of kind of of old information out there
05:42
that can get confusing there's also the
05:46
diffusion of like well I resist
05:48
so what puzzles all talking in the first
05:50
talk about I think here are some of the
05:53
kind of libraries that you've used to
05:54
replace what you're used to on the DBM
05:56
and that's that's also kind of one of
05:60
the one of the early sticking points a
06:02
lot people starting out half of like yes
06:05
even my Android code is even though I
06:07
under code just kind of doing the same
06:08
doing the same thing as it was doing
06:11
natively it's still talking to different
06:12
libraries and that still has a change
06:14
that you have to get used to and then of
06:18
course there's all this new
06:18
configuration stuff that you have to
06:19
learn so uh I touch Ladd we kind of were
06:27
were think about all this stuff and kind
06:29
of getting feedback about the
06:31
difficulties that people having and
06:33
that's what um who had us to put
06:37
together this demo project called can't
06:38
get this both a
06:41
it's a product template as well as a
06:46
documentation so that you can have any
06:52
source for like what is the kind of
06:54
up-to-date
06:55
that's practice I mean when were
06:58
committed to keeping that up to date um
07:01
so one of the dungeons in bet that we
07:05
made with it is once you have kind of
07:10
thought built was installed like that
07:12
you have Xcode and energy installer or
07:17
IntelliJ it pretty much runs out of the
07:20
box
07:21
um and that was uh that was important to
07:23
us because because one of the pieces of
07:24
feedback we were getting was during
07:27
teams would like set up a hack week and
07:28
they wanted to investigate all the month
07:29
clap for him and they would spend the
07:33
entire time just trying to get something
07:34
running and that means you have no time
07:36
to actually like see how it works for a
07:38
use case and that would that cause
07:39
people to dismiss it as as not ready
07:42
even though if they kind of gotten over
07:44
those sorts of big hurdles they might
07:45
have actually made a lot of progress so
07:48
we wanted to kind of help teams get over
07:50
that hole or hurdle more quickly
07:51
um so here's here's what the weather
07:59
somebody that looks like it's if a
08:01
single screen its makes a web call to
08:04
grab a list of dog breeds now lets you
08:08
select which ones are your favorites on
08:10
and doing so it crunching the whole kind
08:14
of lick but basic step but you might see
08:18
in a typical crowd app so you um you
08:21
make the book called you say things
08:22
through the database and then you quit a
08:23
database to lay that out in the UI so uh
08:29
a couple notes on the architecture of
08:32
that on so the data later on is mostly
08:37
shared so that's the the networking
08:42
logic the database logic
08:44
um the kind of glue that holds
08:46
everything together and get in kind of
08:48
like the data that then gets close back
08:50
out to the UI on UI itself on its it's
08:55
too
08:55
seven native you eyes and that lets you
08:59
kind of continue to leverage your like
09:03
native toilet expertise in kind of doing
09:06
the top of a build-up at UI and of like
09:09
working with the latest
09:10
he is that those platforms provide and
09:14
one of the kind of common themes and a
09:18
lot of decisions that we made in
09:19
building camp kit um was kind of making
09:23
things play nicely with colonnaded a
09:26
threatening model obviously it's kind of
09:29
see that as a bit of a theme as I walk
09:33
through some of the some of the code so
09:42
I'm not gonna go super deep on the
09:45
concurrency model um I'm gonna have some
09:48
great talks on it that I had heard to
09:50
you to check out but the kind of short
09:55
version of it is kala native is much
09:59
stricter about mutability and mutability
10:03
and threads then you're used to on the
10:06
radio so anything that is mutable on can
10:11
only move in a single threaten : d axis
10:12
by single thread something that's
10:15
immutable can you share across multiple
10:18
threads and immutable here does not mean
10:22
Albertus VAR or whispers mutable list or
10:26
what you might be thinking of for when
10:28
you see one a vm Kotlin an immutable
10:30
here means frozen which is this new API
10:35
that exists Justin got the native that
10:39
means that objects and everything that
10:42
it had the reference to UM can't be
10:45
changed into a throw a runtime error if
10:47
it does what that ensures is that when
10:52
you pass something across threads um it
10:56
must be in the exact same state in every
10:58
thread and you can't get into these
10:60
weird on base conditions and where what
11:04
do you might get inconsistencies and
11:06
hard to debug errors
11:09
um so those rules are like simple to
11:12
state that implications kind of can take
11:14
a little bit beautifully kind of like
11:17
grass that you're working with and
11:18
they're they're a little different than
11:20
what you're used to in the day vm um but
11:22
it is very possible to work with them
11:24
and it can help you write better like
11:27
safer code in particular like it plays
11:30
nice with um with architecture that kind
11:35
of focuses on immutable data and kind of
11:39
like a bit of a more functional style
11:40
which is a bit the way the industry has
11:43
been going lately anyway
11:49
so let's talk a bit about some of my
11:52
memories that exist in candy space and
11:55
kind of how we're using them in get get
11:57
and I'll start with Colin Xcode routines
12:02
so cover teens are Cotton's asynchrony
12:07
library on that you're probably used to
12:10
coming from the Android world and
12:15
there's kind of two two major at the i/o
12:18
stuff that we make using a kit there's
12:20
like you didn't spend functions where
12:21
you're just kind of like on suspending
12:23
and waiting for single value and there's
12:25
flows where you're listening to strength
12:27
values and these are course so you can
12:32
use these in your you can use any of
12:36
these API is in your common code on iOS
12:41
but suspend function you just don't get
12:44
don't get exposed to a swift obviously
12:46
you can't use it from like your UI ll
12:48
codify us so the way to work around that
12:53
is you can kind of manually pass some
12:56
sort of way on the callback and in in
12:59
cotton 1.4 there will be a there will be
13:03
a kind of thing that generates that on
13:05
that we honestly you don't have to upset
13:08
the manual yourself and another kind of
13:13
important piece of what we're doing in
13:16
can't get is uh so
13:20
curtains
13:22
on another native the release version
13:24
are single-threaded which in practice
13:29
often means me in front of but you can
13:31
be single-threaded on backgrounds right
13:32
as well and that obviously has some
13:36
limitations so there's a preview movies
13:39
of multi-threaded routines that hasn't
13:42
emerged in the main trunk yet because
13:44
there's some some issues that are still
13:46
working on in terms of the memory leaks
13:50
that can happen but camp gate which is
13:54
is trying to find EB I mostly stayed in
13:58
the art but a little bit forward-looking
13:60
makes use of that one for the branch to
14:02
kind of get you started get you started
14:07
ready vote with it in the hopes that
14:08
like by the time that code is production
14:10
that will obvious able and another kind
14:15
of note around our covert easy surgeon
14:17
camp kit were expected to do some
14:20
summary factors at some point in their
14:22
teacher around how we can look over team
14:23
scopes so like right now the shared code
14:26
is creating its own scopes and like to
14:28
adjust that so that at least on the
14:31
Android side the Android code can pass
14:33
in things like email scope you get um
14:36
but you get natively in Android so if
14:40
you're looking at the code today like
14:41
expect some changes there at some point
14:42
the future so moving on from her teams
14:46
on the dependency vector that we use in
14:50
get get is pointing or I should say the
14:55
identity manager so that I don't step
14:57
into the middle of that like dependency
14:58
injection versus service locator today
15:01
but uh we're using a again this is a
15:06
preview of the next version Aquinas it's
15:09
an alpha of going 3.0 and it's what what
15:16
that adds in this was was computed by by
15:19
Kevin again is he it basically on had
15:26
some thread safety by kind of enforcing
15:27
that the configuration of coin happens
15:29
on the main thread on iOS so that you're
15:32
not accidentally passing something
15:33
across threads
15:36
and within our our usage of it in camp
15:41
kit we have kind of a couple different
15:44
innovation points across comedy and
15:46
Python codes you can within point you
15:49
you can kind of injects the MCS at
15:51
different levels so we have the core
15:53
module what you see in the middle here
15:56
that passes to kind of use that kind of
15:59
only only need to be configured from
16:01
common on we also have a via expected
16:05
platform module which lets the the
16:10
common code look less the farm code have
16:14
seen kind of computer sees that coin
16:16
needs to have access to you know we also
16:19
have this extra declaration lambda which
16:22
lists not just the platform code of the
16:25
shared library but also the the like
16:29
talk about location pass dependencies in
16:31
and that lets us insert the android
16:34
application context into the graph and
16:40
then yeah
16:40
one of the pointing to a coin is there's
16:44
a on a test if you have a expose which
16:50
we have we have a test test encamping
16:52
the demonstrates call it check modules
16:55
which provides kind of the same sort of
16:58
graph checking that you get in something
17:00
like daggered or at compile time but it
17:03
runs at unit test time is dead so if
17:05
you're concerned about moving from
17:07
something that's kind of compiled time
17:09
tracking your graph to something that's
17:11
runtime checking it um having something
17:13
like that in place can still help you
17:15
kind of feel confident that your graph
17:17
is staying consistent so case or is the
17:25
cross platform on HTTP client that that
17:29
jeffrys provides and yes it's it's a
17:33
coaching aware if you could be client
17:35
I'm sorry I just did the code that
17:37
innovation but in the wrong order um but
17:40
uh so it does it's under version by a
17:45
felon X serialization library which I
17:48
want with more detail on because we
17:49
don't actually do anything there so Kate
17:56
where right now is not multi-drive safe
17:58
and that it like it's um it's built
18:01
against the not really certain of our
18:04
routines and does it work very well if
18:07
you kind of call it from different
18:09
threads so we have this this workaround
18:15
kind of buried and yank it which is this
18:17
network lambda they didn't see on the
18:19
right there and that basically kind of
18:22
forces the case or calls to happen from
18:25
the main thread um so that k-chart can't
18:28
handle is on threat eternally in the way
18:29
that expected so hopefully that goes
18:33
away over time but it's not stopping you
18:37
from using this stuff right now if
18:39
you're currently see what alight we
18:46
already read about as well earlier today
18:48
but it is the I'm a be cross-platform
18:51
app that base library
18:54
um so what's neat about it on compared
18:58
to use on Lightroom is it generates its
19:01
modeling queries from sequel statements
19:04
um so what you see on the right here is
19:08
like the code that you write is just the
19:10
create table statement and the like the
19:14
data class to implement that is then
19:16
like are generated by by see little a
19:19
and so that it's kind of like the
19:24
universe of what room does what room
19:26
room you kind of need to find your your
19:28
entities in your gala objects and then
19:30
you have to like annotate them with with
19:32
C code that match see the way kind of
19:35
the opposite and says like just or from
19:36
this equal and then you'll like you can
19:39
generate the calling code that's correct
19:41
that meeting said maybe match about
19:42
yourself and then it has problem
19:47
specific runtimes so you you kind of
19:49
pass a separate I'm forgetting that were
19:53
these what you use if you do that's
19:54
different engine onto it from Android M
19:57
for iOS that exactly right inquiries or
20:03
anything we have in here is only for my
20:04
setting so that's that's my library so
20:09
it's key value store so see the light is
20:13
you are like complicated structure data
20:15
storage whatever settings is your I just
20:19
have like one or two little main values
20:22
like a timestamp or user ID or something
20:24
that I want to age and I also have some
20:29
update listener guys which are non
20:31
currently using can't get so yeah I want
20:34
to say too much about it cuz excited
20:36
being my thing and you can we talk about
20:38
in some of the other talks it doesn't
20:40
play a huge role on the epic side yeah
20:45
similar to um to do plate you kind of
20:48
you passing off at home if you delegate
20:50
that's kind of what's after you rioted
20:53
acting storage and that lets you uh as
20:55
you share that back storage from your
20:57
shared code and you are formed
21:01
stately is a lever in touch lab that's
21:06
focused on various parts of concurrency
21:09
management so part of what it does is it
21:14
adds kind of common definitions of the
21:16
different called animated freeze api's
21:17
on so that you can call those from
21:19
common and not just from your native
21:20
code
21:23
it's our module it also kind of had some
21:26
different threading per gives so this is
21:28
the similar on the right is using sea
21:30
views guard stable ref which essentially
21:34
like enforces that the reference that it
21:36
contains is only access from a single
21:39
thread and that's that's part the
21:41
internals of that of that now recall
21:43
that we use and workaround Couture and
21:46
then another thing it has this not from
21:51
a Yank it but is kind of worth
21:52
discussing this is module called base of
21:55
state that essentially lets you handle
22:01
state in animal they started context by
22:03
kind of having a single thread that your
22:05
mutable state lives on and then it
22:08
provides you API is to kind of go in and
22:10
talk through that state Wyeth writing
22:12
for you so there's there's a questions
22:15
versus of some questions implemented on
22:17
top of that that are much more
22:20
performant than the kind of old or CD
22:22
collections that were obvious on the
22:23
topics and did last time ago three
22:30
quickly is a permanent which is volume
22:33
library that we've recently been putting
22:37
together a touch lab and it's uh but
22:43
kind of key piece of it is um it's
22:46
immutable after like your body variation
22:49
is immutable after you firstly period
22:51
which then makes it safe to pass between
22:53
threads so it's not yeah merged into
22:58
can't kid there's if there's a key are
22:59
open right now on so you'll see it there
23:01
soon and yeah we're interested to hear
23:06
feedback if you if it's if it is or it
23:09
isn't hitting or these cases so
23:14
and that's what libraries I'm also
23:15
talking a little bit about I'm just some
23:17
notes some other notes on integration um
23:21
so uh there's there's a bunch of kind of
23:25
what new Gradle things that get added
23:28
when when you go from Calgary and to cut
23:32
the multi-platform and from that we have
23:36
them all kind of set up for you
23:37
initially but we can talk about what
23:39
some of it is so the big thing is the
23:44
way that you set up your NFC's changes
23:47
because you access 500 different targets
23:49
so within your column block or you you
23:52
you have a couple of that now within
23:55
which you you call these different
23:56
target function so like this Android
23:58
function or the iOS are 64 iOS I fix
24:00
people are and that tells the build
24:04
system like these are the platforms that
24:06
my code is gonna build - and then that
24:10
will generate on main test source that's
24:12
for each for each of those targets which
24:15
you could then kind of stuff let me get
24:16
to your appendices floor a lot of MCS
24:21
these days are being published with real
24:23
metadata which means you can kind of gel
24:25
set them from your common main and
24:29
Gradle will figure out how they kind of
24:31
put the right vendors he's in place but
24:34
certain things like this you know
24:35
library you still have to specify for
24:37
each platform no small note here is
24:41
there there is a helper function called
24:45
iOS that essentially does what this
24:47
block here on the right is doing of
24:48
checking whether you're on even this
24:51
emulator or using by son iOS on and it's
24:56
an intermediate source set and between
24:58
them and it doesn't always play nicely
25:00
with Ivy especially the vendor X to do
25:04
so you might see that in some other
25:06
examples but we tend to recommend like
25:08
sticking with the NATO operation for now
25:10
until the IV side and that kind of
25:13
difference I guess cleaned up
25:16
another thing you might be noticing here
25:18
is is we're using a complan build
25:21
scripts I tend to find like it takes a
25:25
little bit of getting used to
25:25
moving from Gradle
25:27
no scripts but it's really nice having
25:30
tomorrow complete and being able to uh
25:34
especially what kind of new great lady
25:37
eyes that are involved in the other
25:38
bathroom side um it's nice happens ma
25:41
didn't need to be able to make these a
25:43
bit more discoverable and then we have
25:46
configuration to opt into generics on
25:49
the objective-c side which in column one
25:53
3x aren't aren't automatically uh for it
25:58
to like Darren's not Anurag that
25:60
important to see in Swift in column with
26:02
a three but it will be in one not four
26:04
and then we opted into the experimental
26:07
reckons API because we were accusing him
26:09
in about two places we have in there on
26:14
the real side is um we have a version of
26:19
the cocoa pod scale plugin so um there's
26:22
a fork of the official Japanese plugin
26:24
um and so general Konev must be around
26:29
Cove odds is it on uses a bunch of the
26:34
iOS integration configuration so without
26:38
that you kind of have to manually on the
26:41
frameworks and a set of a Gradle task to
26:43
copy that framework over to Xcode and
26:46
there's like two different ways that you
26:48
could do it that were in different
26:49
samples for a long time um you know like
26:52
oh gods kind of helps handle that all
26:55
more seamlessly under the hood
26:58
unfortunately the charge plug-in is not
27:01
you can't really configure the framework
27:03
that it generates so one of the things
27:06
that we wanted as we were building up
27:09
gem kit was the ability to debug things
27:13
in Xcode and to do that you need to have
27:15
a dynamic framework instead of a static
27:16
framework which the default cocoa pod
27:20
plugin didn't allow for so we've added
27:23
is on the ability to kind of specify the
27:26
frameworks look um within the gobots
27:29
extension so that you can't so that
27:33
whatever you want to add i'm you can ice
27:35
in there so you like generally sanity
27:39
you'll need
27:41
and also some adjustments in how the pod
27:43
file is generated which helps deal with
27:46
some caching issues that can that can
27:48
cause you issues when you're on like
27:51
trying to make sure you're getting a
27:52
clean build and yet a still in like
27:56
we're still kinda back we don't let me
27:58
that and kind of like figuring out what
28:00
are the things we can do to do with it
28:02
to kind of help develop my flow so looks
28:04
know if you got these cases then morning
28:11
us good side um
28:13
so you young just like has a um I think
28:20
I can plug in for experts you can debug
28:22
your caulking code you need even like
28:25
step into your hot encode from the
28:26
expert debugger um and can't get it set
28:31
up so that you the common sources are
28:33
already in the asset project so you can
28:36
Mikey me get me like talk to the right
28:37
source but you do have to like install
28:40
that plug-in yourself on guest outside
28:44
so in a little short time but in the
28:47
time remaining output got a couple kind
28:51
of things that we've built on top of
28:53
this less interesting um so in general
29:00
um camp it's been really nice for um for
29:06
letting us like not just for kind of
29:08
like from people like here do we even
29:10
get sorta quickly but also for us to
29:11
kind of predict things quickly
29:13
so one ones that I did recently um I
29:15
want to do a blog post to go into more
29:17
detail on at some point soon but it's
29:21
I've seen it a since by a couple times
29:22
lately is around in Iran between our ex
29:27
weapon co-routines
29:29
so this is a thing I've got together to
29:32
kind of like roughly does that where you
29:33
can so the the Derek memory upload
29:37
doesn't get exposed to tube got to see
29:41
because because flow is interface and
29:43
see generics only working classes what
29:47
if you add a wrapper class around it you
29:49
can kind of maintain that type safety
29:51
and pass it up to look this web side
29:55
then you can add this extra kind of
29:58
durable generic function on the swift
30:01
side which lets you uh I think I passed
30:04
the test the different callbacks that
30:06
that flow is looking for and hook them
30:09
into the arts web server wall so this
30:14
isn't um it isn't perfectly thread safe
30:18
has written if you're doing a bunch of
30:20
device threading things on your arts
30:22
website but it does it's kind of like a
30:24
start of how to make them talk to each
30:26
other and once we also look build some
30:32
production code with this so good client
30:37
that was that I think it's kind of like
30:39
prototype like what does feature module
30:41
will look like in in our existing app
30:43
and we're able to use can't get as
30:45
that's kind of a starting point for that
30:47
configuration so we yeah I think we make
30:52
something use to plug it into the client
30:53
field system and in particular like
30:55
there I was attending raju area than
30:57
their Android code on so we did a bunch
30:60
of work around kind of being able to
31:02
toggle between building that building
31:05
the share drain work from from source or
31:09
just like referencing as binary and it's
31:15
been nice kind of like working with
31:17
clients and being able to to kind of go
31:20
back and update cake pitch with
31:22
learnings that we've had from from you
31:23
didn't using similar period into
31:25
production so I think I'm gonna energy
31:30
over but but a couple of just kind of
31:31
like quick final thoughts
31:33
so like the general nice thing of be
31:38
I'll call on what the platform is is you
31:42
have a lot of flexibility so I
31:46
a lot about libraries here in local
31:48
immigration things um but depending on
31:52
what you want to share or like if you
31:54
just have kind of like a pure Islamic
31:55
thing you don't need to use any of that
31:58
if you don't want to try it out or any
31:59
of that stuff like if you just want to
32:01
write your own code you can do that and
32:03
share it really easily absol wanna um
32:08
definitely the sites like this like I'm
32:12
a huge own of the stuff and and I
32:15
definitely think it's kind of the future
32:17
of how a lot of us will be building
32:18
mobile apps um but it's definitely an
32:20
early adopter phase now and you should
32:23
make sure and if I come from lying into
32:24
that so look like there some questions
32:27
earlier or around like is a production
32:28
ready and I think what production ready
32:32
means is different to each team in each
32:34
organization
32:36
so there are you doing a production now
32:38
because to them it is production ready
32:40
um your your opinion of that will will
32:44
vary depending on kind of like your your
32:45
needs but it's definitely out of phase
32:50
where it makes a lot of sense to
32:52
evaluate it and see if it is over that
32:53
line for you so yeah I think with that I
32:59
will pass things over to questions nice
33:04
job thanks so much
33:05
Russell fantastic here so we're gonna
33:09
get the questions going pretty quick
33:11
before I do that here I've got to give
33:16
you the you know you get a stream in our
33:19
live audience here so that they can go
33:29
that was great job okay so I'm gonna
33:33
have Willie bring up our questions here
33:35
and his screen should be sharing with us
33:37
at this point here so you should see the
33:40
questions from slide Oh coming up on
33:42
your screen
33:43
I'm gonna pop out for this sure all
33:47
right so at the top we have what is the
33:50
best see ICD workflow to share
33:52
multi-platform live inside a mobile team
33:53
like single Depot or or a shared lib I
33:58
that is a thing that will vary mighty in
34:01
like what they one of the nice thing is
34:05
about about what kind of modularity of
34:10
problem of the platform is you can kind
34:13
of continue to lean on the same like
34:17
build pipelines and stuff that you are
34:18
the are in area code as you try to
34:20
introduce it so like the new piece is
34:23
now you have the shared library that
34:24
you're going to want to like build and
34:26
test and if you're in a neighborhood
34:28
something we both don't need to kind of
34:29
like publish the article or in the same
34:31
you know you can kind of test them all
34:32
at once
34:34
I don't know that I can like yeah I
34:39
don't know they want to point to kind of
34:40
like a single best workflow I think you
34:44
can you can kind of like make that
34:47
choice depending on on what your needs
34:48
are and on like maybe how much good your
34:50
faring and how how much you need to test
34:52
library isolation versus uh versus kind
34:56
of all together so do you find it
34:60
beneficial or detrimental that KMP
35:01
doesn't include shared UI I wouldn't say
35:07
I certainly don't find detrimental um if
35:11
I think it's like campi is trying to do
35:16
a different thing than flutter is like
35:17
flutter is trying to be shared UI and
35:21
maybe kind of like skips over the
35:23
details of some sort of the hood um came
35:27
he is no it's kind of working at that
35:29
lower level sharing things that are kind
35:32
of like more of a logic layer and less
35:36
less than we do love learn so I think
35:41
that means that panky is a lot more
35:42
flexible um so like like flutters didn't
35:46
have a pretty big impact on the
35:48
architecture and the build process I
35:49
their whole application if you're using
35:51
it campy you can kind of like slot in
35:54
wherever you wanted hit be as much or as
35:56
little as you want and you're not paying
35:60
a huge penalty for even if you're just
36:03
using a little bit
36:07
any tips on improving and build times um
36:12
certainly is something that that we're
36:14
doing something you know um you know did
36:16
something at that um my Japanese has
36:19
been improving over time so like if you
36:20
try this stuff like six months ago
36:22
it definitely does build faster than it
36:24
it did then off the top of my head I
36:30
don't have kind of like specific tips
36:33
um like I mean marginalising always
36:38
helps if you're if you're doing stuff in
36:40
large scale like any way that you can
36:42
kind of not need to be build on your
36:45
pollinator code will help
36:49
have you get around the colony to close
36:52
well Prince of all so they're not a
36:59
company to close were principal eg
37:00
biting iOS collect classes in KP and
37:02
using index code or console classes
37:04
inveteracy not the expose properly so
37:09
this is dissipated on the about there's
37:12
there's there's there's some limitations
37:14
around in the internet around the fact
37:17
that you can't kind of go back and forth
37:20
multiple times between cotton and
37:23
Objective C and you like each each each
37:30
Colin very each binary that you like you
37:33
teach framework that you create
37:34
aggregate encode kind of doesn't know
37:37
about the others on and the way around
37:40
it is I mean the the the easy way around
37:45
it if you can is to kind of do more
37:48
things at the column level because like
37:52
if you're if you're kind of like just in
37:53
the cotton world that you don't have as
37:55
much for the limitations and if you're
38:00
not able to do that then it's just about
38:02
kind of like segue anything so you don't
38:04
have too many interdependencies and
38:06
community modules so like if you have
38:07
multiple frameworks um making sure that
38:11
they do independent enough things that
38:13
they don't need to talk to the same
38:15
stuff in the hood so that you don't have
38:16
to worry about kind of which version of
38:18
column they are in the club
38:26
Clee that sort of also enters the next
38:27
question of what is your experiences
38:29
with dependencies between two libraries
38:30
so it is like it's possible to have
38:34
multiple column libraries in your
38:35
framework as out of one 370 I mean we've
38:39
been doing some kind of testing of some
38:42
limitations of that and and some
38:46
blogging about that I think but um so
38:49
it's it's possible to have to you can't
38:54
like they won't be aware of they did you
38:57
you can't really make paps common types
38:58
between them
38:59
um so if they have their dependencies
39:01
between them again you'll want to do
39:03
that more on the common layer than depa
39:05
so after that - see you later do I know
39:11
any framework for a colony by um so
39:14
there's a couple people that have done
39:16
like some things there's nothing that
39:19
seems to have really caught on very
39:21
largely in the community um I tend to
39:26
think it's like it tends to not meet my
39:29
focus and I tend to think it's a little
39:31
bit kind of early to be too focused on
39:34
the UI side of things like we're calling
39:37
really shines is more at the logic layer
39:40
and you'll you'll have a a easier time
39:45
working with it if you have to get into
39:46
that mindset of I'm not going to share
39:48
every step free piece of code but I've
39:51
got to show you that things that make
39:52
sense to share what are the pros and
39:56
cons of different ways of defining
39:58
dependencies
40:00
mostly it's stylistic so doing that they
40:08
like and I think I've done both in
40:12
different projects um one of the links
40:16
like you know anything is going by
40:17
getting style is is he get all of these
40:21
like unused references like I needed
40:24
aren't warnings which we don't get in
40:26
India in the UM and the source it's
40:29
reckoned in version but mostly it's not
40:32
doesn't make a big difference it's the
40:34
same thing in order
40:38
over the backend any tips about how to
40:40
import a library written with KMP from
40:43
the backend written in Jas so I
40:48
personally haven't done a ton on the Jas
40:50
side so like I haven't ace try to get in
40:54
in alarm settings and I'm like hey I
40:57
have a project that was a JX graduate
41:00
are yet um but I haven't um I'm not very
41:04
familiar with kind of like the more more
41:09
like the deeper side of various
41:12
configuration so uh I don't recommend
41:16
I'm asking about that stuff on on slack
41:19
though and if you and you haven't looked
41:22
at us in a little while there were some
41:25
pretty heavy reeve actors to kind of how
41:27
I was configured in it a while ago now
41:32
in column 1 3 Rd um and the
41:35
documentation has gotten a lot better on
41:37
that in the last couple months so if you
41:40
haven't looked closely at it recently
41:41
doesn't take another look and see that
41:42
house what is difference between
41:46
immutability and freeze so in other
41:51
words that I was using when I was
41:53
talking about freeze they are the same
41:55
thing so so like when you call freeze on
41:58
on an object or when a nominated is
42:01
frozen
42:01
um it's immutability is like a distant
42:04
force that's being immutable topic what
42:11
kind of moves it stops on making towards
42:13
desktop support none that I have been
42:17
part of though I get something that we
42:21
pay some attention to on the library
42:22
side it's easy to to expose try to get
42:28
to a desktop platform or a library or a
42:30
building like will do that but we're
42:32
like the clients that we're talking to
42:35
are mucking around the mobile side
42:38
uh how is the performance of Isis study
42:42
any suggestions best practice to handle
42:44
the chair capture the performance um so
42:48
for that I refer you back to UM Kevin's
42:53
Lagos work where you talked about it
42:55
it's much better than what you had with
43:00
with Atomics in the first day of the
43:02
elections
43:03
um it's not going to be quite as good as
43:05
what you get with just a single for
43:09
everybody but that'sthat's kind of the
43:12
trade-off that you are making by by
43:14
having say that you want to access by
43:16
multiple minutes decide which libraries
43:21
including cam kit largely by the ones
43:24
that we want to be using in the ops that
43:29
we're building and the ones that that
43:32
Adelaide yeah like work well in
43:35
situations that we've encountered and
43:37
that'd be kind of like trust to keep
43:41
updated
43:44
um when do you decide that this logic
43:47
part won't be shared I'm not sure I
43:52
understand specifically what logic part
43:53
that is but um in general like you can
43:57
you can make that sort of decision and
44:00
again you can change it over time
44:03
I get very if you're if you're trying to
44:05
figure out like like what do and don't
44:06
you want to share within as it can go
44:08
bass even kind of like they pick an area
44:13
that seems to make sense start off and
44:14
add more to it over time um it's not
44:17
kind of like a permanent thing um do you
44:24
know if there's a green way to share
44:25
test artifacts the tweeting to MEP
44:27
modules um so but one way that I have
44:32
done it and you can see this in multiple
44:34
settings um if you look at the curation
44:36
in there is create a separate module and
44:41
define those test artifacts in the in
44:43
that that modules main code and then you
44:47
can depend on that module from your test
44:49
code to it takes a bit be suitable well
44:58
great Russell looks like we were able to
44:59
make it through all the questions thank
45:01
you so we've got one more one more that
45:03
popped in let's give you a couple
45:05
seconds stands for that one that's Gary
45:07
yeah sure to use he also what is this
45:11
way to maintain compose Jason KMP so I
45:15
like I say in general make game he is uh
45:18
opinionated on your iPad I'm sure um
45:22
like I tend to find it works a little
45:25
nicer with with like I'm you have an MBI
45:29
stuff that it does then with MEP because
45:31
you might be kind of moving back and
45:32
forth between your your platform in your
45:35
cherry code but but mostly even that is
45:37
not a huge deal
45:40
as far as Jedi compose stuff um don't
45:45
have a great answer for that other than
45:48
that like most of the things that you
45:50
would probably have about the compose
45:53
level are going to be at your UI here
45:56
which is probably your
45:57
pause it there so assuming that is
46:03
correct you're just going to kind of
46:05
leave it your Popham code anyway
46:09
nice well thanks so much this has been
46:14
fantastic to have you Russell also
46:17
Carlos thank you for being with us again
46:19
this is our first installment of the
46:21
multi-platform series so we expect to to
46:24
go deeper will whether there was some
46:26
questions differences with respect to
46:28
flutter and multi platform so we'll be
46:31
covering some of those as well in the
46:33
future future events so anyway really
46:36
have been great to have you all things
46:37
for everybody who signed in to this as
46:40
well it was great having you here with
46:44
us and again check back regularly at at
46:47
droidcon comm and you'll be able to see
46:50
what's coming up next you'll also be
46:53
able to get all of the you'll also be
46:56
able to get all of the presentations
46:58
they're probably within the next day or
47:00
so and we look forward to seeing you
47:02
again at further series here I've heard
47:06
coming online things so once again from
47:08
being with us and we'll see you next
47:09
time
47:17
you
droidcon News
Tech Showcases, Developer Resources & Partners
EmployerBrandingHeader
jobs.droidcon.com
![]() Latest Android Jobs
Kotlin Weekly
![]() Your weekly dose of Kotlin
ProAndroidDev
![]() Android Tech Blogs, Case Studies and Step-by-Step Coding
Zalando
![]() Meet one of Berlin's top employers
Academy for App Success
![]() Google Play resources tailored for the global droidcon community |
Droidcon is a registered trademark of Mobile Seasons GmbH Copyright © 2020. All rights reserved.