Как разделить код в флаттере в режиме релиза? - PullRequest
1 голос
/ 17 января 2020

Я работаю над проектом по использованию Flutter web, и размер js увеличивается, когда я добавляю функции, что является нормой. Я смотрел на отложенный импорт для Flutter и попытался найти разделенные файлы как

List of files on build with size

Я запустил flutter run -d chrome, который работал нормально, как Я узнал, что deferred игнорируется в отладочной сборке, и когда я запускал пакет http-server npm, ничего не происходило, даже если смотреть на сетевой запрос, он запрашивал файлы деталей, но ничего не отображалось на экране и даже не было ошибок в консоли. Я знаю, что Flutter Web недавно перешел на бета-версию, поэтому возможны оптимизации, такие как специальное уменьшение размера main.dart. js, но это должно работать в соответствии с do c.

Network request

Код

main.dart. js

import 'package:flutter/material.dart';
import 'package:split_test/page1.dart' deferred as page1;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: page1.Page1(),
        ),
      ),
    );
  }
}

page1.dart

import 'package:flutter/material.dart';
import 'package:split_test/page2.dart' deferred as pag2;

class Page1 extends StatelessWidget {
  const Page1({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Column(
          children: <Widget>[
            Text('Page1'),
            GestureDetector(
              onTap: () => Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => pag2.Page2(),
                ),
              ),
              child: Text('Go to page 2'),
            )
          ],
        ),
      ),
    );
  }
}

page2.dart. js

import 'package:flutter/material.dart';

class Page2 extends StatelessWidget {
  const Page2({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: Column(
            children: <Widget>[
              Text('Page2'),
              GestureDetector(
                onTap: () => Navigator.pop(context),
                child: Text('<- Back'),
              )
            ],
          ),
        ),
      ),
    );
  }
}

Спасибо за вашу помощь. Я смотрел на этот выпуск .

1 Ответ

1 голос
/ 20 марта 2020

Вы можете использовать отложенный импорт Dart для выполнения чего-то подобного.

См. Это для более подробной информации: https://dart.dev/guides/language/language-tour#lazily -loading-a-library

Также для флаттер В этом выпуске здесь идет важная дискуссия о том, как обеспечить надлежащую поддержку разбиения кода для флаттера: https://github.com/flutter/flutter/issues/50196

...