Allow passing external state to Application::new

This commit is contained in:
Héctor Ramón Jiménez 2020-03-30 18:00:15 +02:00
parent 6e9ab1cd6f
commit c4c5216e3b
13 changed files with 103 additions and 60 deletions

View file

@ -94,11 +94,6 @@ pub use executor::Executor;
/// An [`Application`](trait.Application.html) can execute asynchronous actions
/// by returning a [`Command`](struct.Command.html) in some of its methods.
pub trait Application {
/// The type of __messages__ your [`Application`] will produce.
///
/// [`Application`]: trait.Application.html
type Message: Send;
/// The [`Executor`] that will run commands and subscriptions.
///
/// The [`executor::WasmBindgen`] can be a good choice for the Web.
@ -107,6 +102,16 @@ pub trait Application {
/// [`executor::Default`]: executor/struct.Default.html
type Executor: Executor;
/// The type of __messages__ your [`Application`] will produce.
///
/// [`Application`]: trait.Application.html
type Message: Send;
/// The data needed to initialize your [`Application`].
///
/// [`Application`]: trait.Application.html
type Flags;
/// Initializes the [`Application`].
///
/// Here is where you should return the initial state of your app.
@ -117,7 +122,7 @@ pub trait Application {
/// request, etc.
///
/// [`Application`]: trait.Application.html
fn new() -> (Self, Command<Self::Message>)
fn new(flags: Self::Flags) -> (Self, Command<Self::Message>)
where
Self: Sized;
@ -165,21 +170,16 @@ pub trait Application {
/// Runs the [`Application`].
///
/// [`Application`]: trait.Application.html
fn run()
fn run(flags: Self::Flags)
where
Self: 'static + Sized,
{
use futures::stream::StreamExt;
let (app, command) = Self::new();
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let body = document.body().unwrap();
let mut title = app.title();
document.set_title(&title);
let (sender, receiver) =
iced_futures::futures::channel::mpsc::unbounded();
@ -187,6 +187,12 @@ pub trait Application {
Self::Executor::new().expect("Create executor"),
sender.clone(),
);
let (app, command) = Self::new(flags);
let mut title = app.title();
document.set_title(&title);
runtime.spawn(command);
let application = Rc::new(RefCell::new(app));