最近学flutter,网上下载别人的flutter工程尝试运行flutter pub get
,报错如下:提示我需要将flutter从V1项目升级V2
Your Flutter application is created using an older version of the Android
embedding. It's being deprecated in favor of Android embedding v2. Follow the
steps at
//flutter.dev/go/android-project-migration
to migrate your project.
根据官方提供的地址以及参考提供的方法,最终只需要改动\android\app\src\main目录下的AndroidManifest. xml文件。增加如下内容:
Kể từ ngày 1. Bản phát hành ngày 12 tháng 12, API plugin mới có sẵn cho nền tảng Android. API cũ dựa trên
4 sẽ không bị phản đối ngay lập tức, nhưng chúng tôi khuyến khích bạn chuyển sang API mới dựa trên
5API mới có lợi thế là cung cấp một bộ trình truy cập sạch hơn cho các thành phần phụ thuộc vào vòng đời so với các API cũ. Chẳng hạn, có thể trả về null nếu Flutter không được đính kèm với bất kỳ hoạt động nào
Nói cách khác, các plugin sử dụng API cũ có thể tạo ra các hành vi không xác định khi nhúng Flutter vào ứng dụng Android. Hầu hết các plugin Flutter được cung cấp bởi rung. nhóm nhà phát triển đã được di chuyển. [Tìm hiểu cách trở thành nhà xuất bản được xác minh trên pub. nhà phát triển. ] Để biết ví dụ về plugin sử dụng API mới, hãy xem gói pin plus
Các bước nâng cấp
Các hướng dẫn sau đây phác thảo các bước để hỗ trợ API mới
Cập nhật lớp plugin chính [
7] để triển khai giao diện
5. Đối với các plugin phức tạp hơn, bạn có thể tách
5 và
0 thành hai lớp. Xem phần tiếp theo, , để biết thêm chi tiết về cách truy cập tài nguyên ứng dụng bằng phiên bản nhúng mới nhất [v2]package io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
Ngoài ra, hãy lưu ý rằng plugin vẫn phải chứa phương thức tĩnh
1 để duy trì khả năng tương thích với các ứng dụng không sử dụng tính năng nhúng Android v2. [Xem Nâng cấp trước 1. 12 dự án Android để biết chi tiết. ] Điều dễ làm nhất [nếu có thể] là chuyển logic từpackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
1 sang một phương thức riêng tư mà cảpackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
1 vàpackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
4 đều có thể gọi.package io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
1 hoặcpackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
4 sẽ được gọi, không phải cả haipackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
Ngoài ra, bạn nên ghi lại tất cả các thành viên công khai không bị ghi đè trong plugin. Trong kịch bản bổ sung vào ứng dụng, các lớp này có thể truy cập được đối với nhà phát triển và yêu cầu tài liệu
[Tùy chọn] Nếu plugin của bạn cần tham chiếu
7, hãy triển khai cả giao diệnpackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
8package io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
[Tùy chọn] Nếu plugin của bạn dự kiến sẽ được giữ trong Dịch vụ nền tại bất kỳ thời điểm nào, hãy triển khai giao diện
9package io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
Cập nhật ứng dụng mẫu của
0 để sử dụng tính năng nhúng v2
1. Để biết chi tiết, xem Nâng cấp trước 1. 12 dự án Android. Bạn có thể phải tạo một hàm tạo công khai cho lớp plugin của mình nếu một hàm chưa tồn tại. Ví dụpackage io.flutter.plugins.firebasecoreexample; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugins.firebase.core.FirebaseCorePlugin; public class MainActivity extends FlutterActivity { // You can keep this empty class or remove it. Plugins on the new embedding // now automatically registers plugins. }
[Tùy chọn] Nếu bạn đã xóa
0, hãy cập nhật
3 để sử dụng
4. Ví dụ[Tùy chọn] Tạo tệp
5] sử dụng nhúng v1 cho dự án mẫu trong cùng thư mục với
6 để tiếp tục kiểm tra khả năng tương thích của nhúng v1 với plugin của bạn. Lưu ý rằng bạn phải đăng ký thủ công tất cả các plugin thay vì sử dụng
7. Ví dụpackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate[Bundle savedInstanceState] { super.onCreate[savedInstanceState]; BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]]; } }
Thêm
8 vào
3. Điều này đặt ứng dụng mẫu để sử dụng tính năng nhúng v2[Tùy chọn] Nếu bạn đã tạo một
0 ở bước trước, hãy thêmdefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
0 vào tệpdefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
3. Ví dụ
Kiểm tra plugin của bạn
Các bước còn lại giải quyết việc kiểm tra plugin của bạn, chúng tôi khuyến khích nhưng không bắt buộc
Cập nhật
3 để thay thế các tham chiếu tớidefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
4 bằngdefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
5defaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
defaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
dependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
Thêm tệp kiểm tra cho
6 và
0 trongdefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
8. Bạn sẽ cần tạo các thư mục này. Ví dụdefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
package io.flutter.plugins.firebase.core; import androidx.test.rule.ActivityTestRule; import io.flutter.plugins.firebasecoreexample.MainActivity; import org.junit.Rule; import org.junit.runner.RunWith; @RunWith[FlutterRunner.class] public class MainActivityTest { // Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`. @Rule public ActivityTestRule rule = new ActivityTestRule[MainActivity.class]; }
package io.flutter.plugins.firebase.core; import androidx.test.rule.ActivityTestRule; import io.flutter.plugins.firebasecoreexample.EmbeddingV1Activity; import org.junit.Rule; import org.junit.runner.RunWith; @RunWith[FlutterRunner.class] public class EmbeddingV1ActivityTest { @Rule public ActivityTestRule rule = new ActivityTestRule[EmbeddingV1Activity.class]; }
Thêm
9 vàdefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
0 dev_dependencies vàodependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
1 vàdependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
2dependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
integration_test: sdk: flutter flutter_driver: sdk: flutter
Cập nhật phiên bản môi trường Flutter tối thiểu trong
1. Tất cả các plugin trong tương lai sẽ đặt phiên bản tối thiểu thành 1. 12. 13+bản sửa lỗi. 6, đây là phiên bản tối thiểu mà chúng tôi có thể đảm bảo hỗ trợ. Ví dụdependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
environment: sdk: ">=2.16.1 =1.17.0"
Tạo một bài kiểm tra đơn giản trong
4. Với mục đích kiểm tra PR bổ sung hỗ trợ nhúng v2, chúng tôi đang thử kiểm tra một số chức năng rất cơ bản của plugin. Đây là thử nghiệm khói để đảm bảo rằng plugin đăng ký đúng cách với trình nhúng mới. Ví dụdependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
0Chạy thử
9 thử nghiệm tại địa phương. Trong một thiết bị đầu cuối, làm như saudefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
1
plugin cơ bản
Để bắt đầu với plugin Flutter Android trong mã, hãy bắt đầu bằng cách triển khai
5
2Như được hiển thị ở trên, plugin của bạn có thể [hoặc có thể không] được liên kết với trải nghiệm Flutter nhất định tại bất kỳ thời điểm nào. Bạn nên cẩn thận khởi tạo hành vi của phần bổ trợ của mình trong
package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
4, sau đó dọn sạch các tham chiếu của phần bổ trợ trong dependencies {
...
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
...
}
8FlutterPluginBinding cung cấp cho plugin của bạn một số tài liệu tham khảo quan trọng
ràng buộc. getFlutterEngine[] Trả về dependencies {
...
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
...
}
9 mà plugin của bạn được đính kèm, cung cấp quyền truy cập vào các thành phần như package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.MainActivity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class MainActivityTest {
// Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`.
@Rule public ActivityTestRule rule = new ActivityTestRule[MainActivity.class];
}
0, package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.MainActivity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class MainActivityTest {
// Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`.
@Rule public ActivityTestRule rule = new ActivityTestRule[MainActivity.class];
}
1, v.v. ràng buộc. getApplicationContext[] Trả về package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.MainActivity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class MainActivityTest {
// Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`.
@Rule public ActivityTestRule rule = new ActivityTestRule[MainActivity.class];
}
2 của ứng dụng Android cho ứng dụng đang chạyPlugin UI/Hoạt động
Nếu plugin của bạn cần tương tác với giao diện người dùng, chẳng hạn như yêu cầu quyền hoặc thay đổi giao diện người dùng Android chrome, thì bạn cần thực hiện các bước bổ sung để xác định plugin của mình. Bạn phải triển khai giao diện
package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
8
3Để tương tác với một
package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
7, plugin package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
8 của bạn phải thực hiện hành vi phù hợp ở 4 giai đoạn. Đầu tiên, plugin của bạn được gắn vào một package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
7. Bạn có thể truy cập vào package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
7 đó và một số cuộc gọi lại của nó thông qua package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.MainActivity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class MainActivityTest {
// Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`.
@Rule public ActivityTestRule rule = new ActivityTestRule[MainActivity.class];
}
8 được cung cấpVì các
package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
7 có thể bị hủy trong quá trình thay đổi cấu hình, bạn phải dọn sạch mọi tham chiếu đến package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
7 đã cho trong package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.EmbeddingV1Activity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class EmbeddingV1ActivityTest {
@Rule
public ActivityTestRule rule =
new ActivityTestRule[EmbeddingV1Activity.class];
}
1, sau đó thiết lập lại các tham chiếu đó trong package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.EmbeddingV1Activity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class EmbeddingV1ActivityTest {
@Rule
public ActivityTestRule rule =
new ActivityTestRule[EmbeddingV1Activity.class];
}
2Cuối cùng, trong
package io.flutter.plugins.firebase.core;
import androidx.test.rule.ActivityTestRule;
import io.flutter.plugins.firebasecoreexample.EmbeddingV1Activity;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith[FlutterRunner.class]
public class EmbeddingV1ActivityTest {
@Rule
public ActivityTestRule rule =
new ActivityTestRule[EmbeddingV1Activity.class];
}
3 plugin của bạn sẽ dọn sạch tất cả các tham chiếu liên quan đến hành vi của package io.flutter.plugins.batteryexample;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.battery.BatteryPlugin;
public class EmbeddingV1Activity extends FlutterActivity {
@Override
protected void onCreate[Bundle savedInstanceState] {
super.onCreate[savedInstanceState];
BatteryPlugin.registerWith[registrarFor["io.flutter.plugins.battery.BatteryPlugin"]];
}
}
7 và quay lại cấu hình không phải giao diện người dùng