在执行将使用java库获取数据的基于本机的java代码之前,如何显示颤振的第一个屏幕

在执行将使用java库获取数据的基于本机的java代码之前,如何显示颤振的第一个屏幕,java,flutter,dart,Java,Flutter,Dart,我在做一个关于flifter的项目,它必须从互联网上获取数据。我试图用dart来完成它,但不可能,所以我决定用java来完成它,它解决了这个问题。在加载屏幕显示在屏幕上之前,本机java代码开始执行,然后它显示一些白色屏幕,然后它就转到主页在那里,我可以让我的加载屏幕先出现,然后在加载屏幕显示时从互联网加载数据,用户等待,加载结束后将屏幕推到主屏幕。 我试着将睡眠持续时间设置为1秒,这样它就可以先渲染加载屏幕,但没有成功 这是我的java代码 public class MainActivity

我在做一个关于flifter的项目,它必须从互联网上获取数据。我试图用dart来完成它,但不可能,所以我决定用java来完成它,它解决了这个问题。在加载屏幕显示在屏幕上之前,本机java代码开始执行,然后它显示一些白色屏幕,然后它就转到主页在那里,我可以让我的加载屏幕先出现,然后在加载屏幕显示时从互联网加载数据,用户等待,加载结束后将屏幕推到主屏幕。 我试着将睡眠持续时间设置为1秒,这样它就可以先渲染加载屏幕,但没有成功

这是我的java代码

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "samples.flutter.dev/battery";
    @Override
    public  void configureFlutterEngine( FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler(
                        (call, result) -> {
                            if (call.method.equals("getDate")) {
                                try {

                                    result.success(getReal2());
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                } catch (ExecutionException e) {
                                    e.printStackTrace();
                                }
                            }
                            else {
                                result.notImplemented();
                            }

                        }
                );
    }





    public static List getCoffee() throws IOException {

        ArrayList coffee = new ArrayList();
        Document doc;
        doc= Jsoup.connect("https://www.bankofabyssinia.com").timeout(6000).get();
        for(int i=0;i<=8;i++) {
             for (int j=2;j<=3;j++){
                 coffee.add(doc.select(" #myTable > tbody > tr:nth-child("+i+") > td:nth-child("+j+")").text());

             }

 
        }
        return coffee;
    }


    @TargetApi(Build.VERSION_CODES.N)
    public List getReal2() throws ExecutionException, InterruptedException {
        CompletableFuture<List > completableFuture = CompletableFuture.supplyAsync(() -> {
            try {

                return getCoffee();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        });
        while (!completableFuture.isDone()) {


        }
        List result = completableFuture.get();

        return  result;
    }

}
公共类main活动扩展了公共类main活动{
专用静态最终字符串通道=“samples.flatter.dev/battery”;
@凌驾
公共无效配置颤振引擎(颤振引擎颤振引擎){
超级配置颤振发动机(颤振发动机);
新方法通道(flatterEngine.getDartExecutor().getBinaryMessenger(),通道)
.setMethodCallHandler(
(电话,结果)->{
if(call.method.equals(“getDate”)){
试一试{
result.success(getReal2());
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}
否则{
result.notImplemented();
}
}
);
}
公共静态列表getCoffee()引发IOException{
ArrayList咖啡=新的ArrayList();
文件文件;
doc=Jsoup.connect(“https://www.bankofabyssinia.com)超时(6000.get();
对于(int i=0;i{
试一试{
返回getCoffee();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
});
而(!completableFuture.isDone()){
}
列表结果=completableFuture.get();
返回结果;
}
}
这是我的颤振代码


import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'Home.dart';

class Load extends StatefulWidget {
 @override
 _LoadState createState() => _LoadState();
}

class _LoadState extends State<Load> {
 static const platform = const MethodChannel('samples.flutter.dev/battery');

 void getWholeJava() async {
   try {
     final List result = await platform.invokeMethod('getDate');

     Navigator.of(context).pushReplacement(MaterialPageRoute(
         builder: (BuildContext context) => Home(
               whole: result,
             )));
   } on PlatformException catch (e) {
     print(e);
   }
 }

 @override
 void initState() {
   // TODO: implement initState
   super.initState();

   getWholeJava();
 }

 @override
 Widget build(BuildContext context) {
   return Scaffold(body: Builder(builder: (BuildContext context) {
     return Container(
       child: Center(
           child: Column(
         children: <Widget>[
           Text(
             'The app is loading',
             style: TextStyle(
                 fontSize: 40.0,
                 fontWeight: FontWeight.w900,
                 color: Colors.green[900]),
           ),
           
         ],
       )),
     );
   }));
 }
}


导入“dart:io”;
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
输入“Home.dart”;
类加载扩展了StatefulWidget{
@凌驾
_LoadState createState()=>\u LoadState();
}
类_LoadState扩展了状态{
静态常数平台=常数方法通道('samples.flatter.dev/battery');
void getWholeJava()异步{
试一试{
最终列表结果=wait platform.invokeMethod('getDate');
导航器.of(上下文).pushReplacement(MaterialPage路线(
生成器:(BuildContext上下文)=>Home(
整体:结果,
)));
}平台上异常捕获(e){
印刷品(e);
}
}
@凌驾
void initState(){
//TODO:实现initState
super.initState();
getWholeJava();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(主体:生成器(生成器:(BuildContext上下文){
返回容器(
儿童:中心(
子:列(
儿童:[
正文(
“应用程序正在加载”,
样式:TextStyle(
字体大小:40.0,
fontWeight:fontWeight.w900,
颜色:颜色。绿色[900]),
),
],
)),
);
}));
}
}

首先,android将默认为其启动屏幕,该屏幕由模板flift android项目中的
launch\u background.xml
管理。这意味着您需要为启动屏幕使用背景色,这将与android本机启动屏幕可绘制一起使用

接下来,要实现一个启动屏幕,该屏幕将导航到一个页面,您可以在其中运行和加载数据,您可以查看以下内容:

import 'package:async/async.dart';
class SampleSplashScreenPage extends StatefulWidget {
  @override
  _SampleSplashScreenPageState createState() => new _SampleSplashScreenPageState();
}

class _SampleSplashScreenPageState extends State<SampleSplashScreenPage> {
  @override
  void initState() {
    super.initState();

  new RestartableTimer(new Duration(seconds: 3), () async {
     await Navigator.push(context, MaterialPageRoute(builder: (_) {
      return FlutterDataLoadingPage();
    }));
    });
  }

  @override
  Widget build(BuildContext context) {
       return new Text("Your splash screen");
  }
import'package:async/async.dart';
类SampleSplashScreenPage扩展StatefulWidget{
@凌驾
_SamplesPlashScreenPagentate createState()=>新建_SamplesPlashScreenPagentate();
}
类_samplesPlashScreenPeartate扩展状态{
@凌驾
void initState(){
super.initState();
新的重启计时器(新的持续时间(秒:3),()异步{
wait Navigator.push(上下文,MaterialPage路由(生成器:(){
返回DataLoadingPage();
}));
});
}
@凌驾
小部件构建(构建上下文){
返回新文本(“您的启动屏幕”);
}
RestartableTimer
是一个类,它将启动秒表,并将计数到指定的持续时间。一旦达到此持续时间,它将调用您传递给它的处理程序,在本例中,该处理程序是负责读取远程数据的页面的导航逻辑。顺便说一句,此计数器不会重新启动,并将自动运行垃圾收集器无法处理这些垃圾

查看文档以了解更多信息:

这看起来像是一个问题。你肯定可以解析HTML而不必编写到Java的桥接器吗?我尝试使用webscraper包。问题是CSS查询选择器方法不接受用于从表中删除数据的第n个子选择器,因为我的任务无法完成,所以我不得不将脸转向JavaMate,感谢它成功了真的,你为我节省了很多时间!