代码编织梦想


import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_weight_ui/model/home_article_data_entity.dart';
import 'package:flutter_weight_ui/net/RequestUtils.dart';

class ArticlePage extends StatefulWidget{
  @override
  State<StatefulWidget> createState()  =>_ArticlePage();
}
class _ArticlePage extends State<ArticlePage>{
  int page=0;
  static const myPlugin = const MethodChannel("samples.flutter.io/webview");//通道与Android原生交互
  List<HomeArticleDataDataData> articleList = [];
  ScrollController _scrollController = ScrollController();//listView的控制器
  @override
  void initState() {
    getArticleList(page);
    _scrollController.addListener(() {
      if(_scrollController.position.pixels==_scrollController.position.maxScrollExtent){//如果是最后一个item则触发,加载新数据
        page++;
        getArticleList(page);
      }
    });
    super.initState();
  }
  getArticleList(int page) async {
    var result  = await RequestManager.request("https://www.wanandroid.com/article/list/$page/json");
    setState(() {
      HomeArticleDataEntity dataEntity =  HomeArticleDataEntity().fromJson(result);
      if(page==0){
        articleList.clear();
      }
      articleList.addAll(dataEntity.data.datas);
    });
  }
  /// 下拉刷新方法
  Future<Null> _onRefresh() async{
    page=0;
    getArticleList(page);
  }
  ///加载更多

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("文章"),
      ),
      body:
      RefreshIndicator(
        onRefresh: _onRefresh,
        child: ListView.builder(
          itemCount: articleList.length,
          controller: _scrollController,
          itemBuilder:(BuildContext context,int index){
            return  Container(
              margin:EdgeInsets.all(10.0),
              decoration: BoxDecoration(
                  color: Colors.white70,
                  border: Border.all(color: Colors.white, width: 1.0),
                  borderRadius: BorderRadius.all(Radius.circular(12.0))
              ),
              child:
              GestureDetector(
                onTap: (){
                  Map<String, String> map = {"url": articleList[index].link};
                   myPlugin.invokeMethod("setWebViewUrl",map);//把url传递给原生页面
                },
                child:ConstrainedBox(//需要包上一层,否则会报错
                  constraints: BoxConstraints.tightForFinite(width: double.infinity,height: 120.0),
                  child: Stack(
                    alignment:Alignment.center , //指定未定位或部分定位widget的对齐方式
                    children: <Widget>[
                      Positioned(
                        top: 8.0,
                        left: 8.0,
                        child: Text(articleList[index].shareUser==""?articleList[index].author:articleList[index].shareUser),
                      ),
                      Positioned(
                        right: 8.0,
                        top: 8.0,
                        child: Text(articleList[index].niceShareDate),
                      ),
                      Container(
                        padding: EdgeInsets.only(left: 8.0,top: 35.0,right: 8.0),
                        child:
                        Column(
                          children: <Widget>[
                            Expanded(//Expanded只能在Row Colum中,否则会有异常。如果不加ExpandedText无法实现自动换行
                              child:
                              Align(//如果不包一层Align,会出现文字换行第二行居中
                                alignment: Alignment.topLeft,
                                child:
                                Text(articleList[index].title,
                                  overflow: TextOverflow.ellipsis,
                                  maxLines: 2,
                                  style: TextStyle(
                                    color: Colors.black,
                                    fontWeight: FontWeight.bold,
                                    fontSize: 15.0,
                                  ),
                                ),
                              ) ,
                            ),
                          ],
                        ),
                      ),
                      Positioned(
                        left: 8.0,
                        bottom: 16.0,
                        child: Text(articleList[index].superChapterName,style: TextStyle(
                            color: Colors.red
                        ),),
                      ),
                      Positioned(
                        right: 8.0,
                        bottom: 16.0,
                        child: Image(
                          width: 15.0,
                          height: 15.0,
                          image: AssetImage("assets/images/love.png"),
                        ),
                      ),
                    ],
                  ),
                ) ,
              ),
            );
          },
        ),
      ),
    );
  }

}

网络请求的类可以去上一篇文章找,中间遇见的问题Text无法自动换行,加上Expand包一层就好,又遇见第二个问题,换行之后第二行居中,加了一层Align就好了。中间有Flutter把webUrl传递给原生,原生的代码如下:

package com.example.flutter_weight_ui

import android.content.Intent
import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
    private val CHANNEL = "samples.flutter.io/webview"//通道名称
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GeneratedPluginRegistrant.registerWith(FlutterEngine(this))
        MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
            if(call.method=="setWebViewUrl"){//flutter方法名称
                var url:String = call.argument("url")!!
                var intent = Intent(this,WebViewActivity::class.java).putExtra("url", url)
                startActivity(intent)
            }
        }
    }
}
package com.example.flutter_weight_ui

import android.app.Activity
import android.os.Bundle
import android.webkit.WebView

class WebViewActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_webview)
         var webview:WebView = findViewById(R.id.webview);
        webview.loadUrl(intent.getStringExtra("url"))
    }
}

在清单文件中注册一下

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq939782569/article/details/111035791

Java入门(static练习)-爱代码爱编程

static练习 有关static的理论知识,请参考上篇博客。 * 编写一个实现银行账户的概念,包含的属性有:“账号”,“密码”, * “存款余额”,“例率”,“最小金额”。 * 定义封装这些属性的方法,账号要自动生成。 * 编写主类,使用银行账户类,输入,输出三个储户的上述信息 * 考虑:那些属性可以设计成static属性 代码 package

(详细)git提交和更新项目到gitee-爱代码爱编程

git提交到gitee 先在gitee新建仓库 首先在桌面登录 git 更新代码到gitee 1、git status 查看当前有变更的代码文件。 2、git add ./(git add . ) 你本地所有修改了的文件添加到暂存区。 3、git commit -m “xxxxx” 引号里面是你的介绍,就是你的这次的提交是什么内容,便

获取两个时间段内的工作日工具类-爱代码爱编程

 工具类 package org.jsola.salary.common; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.commons.

接口无实现 ,动态代理Dome-爱代码爱编程

mybaties 是怎么实现动态代理无实现的接口的 创建DAO接口 package com.tang.xx.web.vo.mente.param; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Update; public int

对象存储OSS之测试OSS的基本API-爱代码爱编程

经过之前的学习,我们已经开通了阿里云OSS服务并配置了测试账号权限,接下来就可以开始学习OSS的基本API了。 如何快速的掌握使用一门技术? 快速掌握使用一门技术,是每个程序员都要掌握的基本能力。一般只需要做到以下两点: 1、查看官方文档 2、练习基本的API 阿里云OSS帮助文档 阿里云OSS的API都在帮助文档里,我们首先要做的就是找到帮助文档

每日三道题2020-12-11-爱代码爱编程

每日三道题(答案在下方) 说一说Java的Interface和abstract class 的区别?说一说String与StringBuffer的区别?什么场景下使用BigDecimal类型? | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

配置签名设置-爱代码爱编程

配置签名设置 参考:gradle中隐藏Keystore密码 简单实现配置化: 方式1: 把签名信息(主要是密码)写在gradle中是不安全的,我们可以把这些签名信息添加到gradle.properties: RELEASE_KEY_PASSWORD = 123456 RELEASE_KEY_ALIAS = releaseKey RELEASE_STO

隐藏软键盘(可用于Activity,Fragment)-爱代码爱编程

用法:SoftKeyboardUtil.hideSoftKeyboard(LoginActivity.this); 代码如下: import android.app.Activity; import android.content.Context; import android.view.View; import android.view.input

Glide SimpleTarget 过时-爱代码爱编程

想利用Glide来获取图片的宽高 发现SimpleTarget方法已经过时了,百度了半天也没找到替代方法… 当前使用的Glide版本为: com.github.bumptech.glide:glide:4.11.0 SimpleTarget 已经过时了… 代替方法,此方法可以获取图片的宽高信息。 Glide.with(context)

Android:双11已经过了双12都要到了,还不给你的APP加上自动换图标的功能吗?-爱代码爱编程

前言 也许你也注意到了,在临近双11之际,手机上电商类APP的应用图标已经悄无声息换成了双11专属图标,比如某宝和某东: 可能你会说,这有什么奇怪的,应用市场开启自动更新不就可以了么? 真的是这样吗? 为此,我特意查看了我手机上的某宝APP的当前版本,并对比了历史版本上的图标,发现并不对应。 默认是88会员节专属图标,而现在显示的是双

Android与MVC设计模式(我的学习笔记4)-爱代码爱编程

Android与MVC设计模式 2.6 添加图标资源2.7 挑战练习:为TextView添加监听器2.8 挑战练习:添加后退按钮2.9 挑战练习:从按钮到图标按钮 提示:部分资源来源网络,仅供学习,侵权即删! 指导教材:Android编程权威指南 #本博客操作基于上一篇博客,读者有需要自行阅读。 提示:为避免内容冗余,这里只展示大致过

息屏后报错,信息为 java.lang.IllegalArgumentException: width and height must be > 0-爱代码爱编程

现遇到问题,息屏后,报错 java.lang.IllegalArgumentException: width and height must be > 0 但是我的图片的宽高都是大于0的啊,什么鬼? 已解决,目前本人使用的方法是在Activity的生命周期中进行操作处理,熄屏时,生命周期会先调用onPause方法,我们可以在这里进行操作。 也可以观