recherche

Maison  >  Questions et réponses  >  le corps du texte

Le composant web de weex ne peut pas être chargé côté Android lorsque src est une variable.

Lorsque j'utilise le web weex, je définis src comme variable côté Android, le webView ne peut pas être chargé avec succès.
nous codons est le suivant :

    <template>
        <tm-navpage title='{{title}}' listenning_rigth_button_click=true>
            <web id='toomao-web' src='{{src}}' style='width: 750; height: 1206;' onpagefinish='pagefinish'></web>
            <tm-loading if='loading'></tm-loading>
        </tm-navpage>
    </template>


<script>
    data: {
        src: '', // web加载链接
        url: '', // url参数
        userInfo: '',
        title: '',
        loading: true,
        canGoBack: false, // 记录当前webView的加载信息
    },
    created() {
        this.url = decodeURIComponent(getUrlParams(this, 'url'));
    }
</script>

L'implémentation web sur Android est principalement la suivante :

@Deprecated
    public WXWeb(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
        this(instance,dom,parent,isLazy);
    }

    public WXWeb(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
        super(instance, dom, parent, isLazy);
        createWebView();
    }

    protected void  createWebView(){
        mWebView = new WXWebView(getContext());
    }

    @Override
    protected View initComponentHostView(@NonNull Context context) {
        mWebView.setOnErrorListener(new IWebView.OnErrorListener() {
            @Override
            public void onError(String type, Object message) {
                fireEvent(type, message);
            }
        });
        mWebView.setOnPageListener(new IWebView.OnPageListener() {
            @Override
            public void onReceivedTitle(String title) {
                if (getDomObject().getEvents().contains(Constants.Event.RECEIVEDTITLE)) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("title", title);
                    fireEvent(Constants.Event.RECEIVEDTITLE, params);
                }
            }

            @Override
            public void onPageStart(String url) {
                if ( getDomObject().getEvents().contains(Constants.Event.PAGESTART)) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("url", url);
                    fireEvent(Constants.Event.PAGESTART, params);
                }
            }

            @Override
            public void onPageFinish(String url, boolean canGoBack, boolean canGoForward) {
                if ( getDomObject().getEvents().contains(Constants.Event.PAGEFINISH)) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("url", url);
                    params.put("canGoBack", canGoBack);
                    params.put("canGoForward", canGoForward);
                    fireEvent(Constants.Event.PAGEFINISH, params);
                }
            }
        });
        return mWebView.getView();
    }

    @Override
    public void destroy() {
        super.destroy();
        getWebView().destroy();
    }

    @Override
    protected boolean setProperty(String key, Object param) {
        switch (key) {
            case Constants.Name.SHOW_LOADING:
                Boolean result = WXUtils.getBoolean(param,null);
                if (result != null)
                    setShowLoading(result);
                return true;
            case Constants.Name.SRC:
                String src = WXUtils.getString(param,null);
                if (src != null)
                    setUrl(src);
                return true;
        }
        return super.setProperty(key,param);
    }

    @WXComponentProp(name = Constants.Name.SHOW_LOADING)
    public void setShowLoading(boolean showLoading) {
        getWebView().setShowLoading(showLoading);
    }

    @WXComponentProp(name = Constants.Name.SRC)
    public void setUrl(String url) {
        if (TextUtils.isEmpty(url) || getHostView() == null) {
            return;
        }
        if (!TextUtils.isEmpty(url)) {
            loadUrl(getInstance().rewriteUri(Uri.parse(url), URIAdapter.WEB).toString());
        }
    }

    public void setAction(String action) {
        if (!TextUtils.isEmpty(action)) {
            if (action.equals(GO_BACK)) {
                goBack();
            } else if (action.equals(GO_FORWARD)) {
                goForward();
            } else if (action.equals(RELOAD)) {
                reload();
            }
        }
    }
    

    private void fireEvent(String type, Object message) {
        if (getDomObject().getEvents().contains(Constants.Event.ERROR)) {
            Map<String, Object> params = new HashMap<>();
            params.put("type", type);
            params.put("errorMsg", message);
            fireEvent(Constants.Event.ERROR, params);
        }
    }

    private void loadUrl(String url) {
        getWebView().loadUrl(url);
    }

    private void reload() {
        getWebView().reload();
    }

    private void goForward() {
        getWebView().goForward();
    }

    private void goBack() {
        getWebView().goBack();
    }

    private IWebView getWebView() {
        return mWebView;
    }

Question

Pendant le processus de débogage, j'ai découvert que la méthode setProperty ne sera exécutée qu'une seule fois, c'est-à-dire que lors de la configuration, lorsque src est réaffecté, le Web ne rafraîchira pas l'URL et ne la rechargera pas. Je demande comment réaliser que lorsque src change, le Web peut être rechargé,

J'ai essayé la méthode refreshData et j'ai constaté qu'elle ne serait pas appelée non plus.

    @Override
    public void refreshData(WXComponent component) {
        super.refreshData(component);
        component.getDomObject().getAttrs();
    }
某草草某草草2755 Il y a quelques jours850

répondre à tous(2)je répondrai

  • 世界只因有你

    世界只因有你2017-06-05 11:13:08

    J'ai soudain senti que c'était votre style d'écriture. . .
    src='{{src}}' 改为 :src='src'

    répondre
    0
  • 为情所困

    为情所困2017-06-05 11:13:08

    L'attribut

    src accepte une chaîne Lorsque vous devez utiliser une variable, la syntaxe correspondante pour vue est v-bind
    src='{{src}}' passe en fait un < If the. chaîne de code>{{src}} est entrée, elle ne sera certainement pas analyséesrc='{{src}}'实际上是传了一个{{src}}的字符串进去,肯定解析不了
    所以要用:src='variable'Alors utilisez :src='variable'
    Etv-bindaccepte non seulement les variables, mais peut aussi écrire une expression

    J'ai jeté un œil à votre code. Si votre onPageFinish est un événement, il doit être lié à v-on, ce qui signifie qu'il doit être écrit comme @onPageFinish

    répondre
    0
  • Annulerrépondre