Skip to content

Commit 0115ce1

Browse files
committed
chore: release 6.9.3
1 parent 6713b69 commit 0115ce1

8 files changed

Lines changed: 81 additions & 39 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@
33
## Unreleased
44

55

6+
## 6.9.3 - 2026-03-24
7+
8+
### 🐛 Bug Fixes
9+
- Fixed a Compose/Jewel layout crash when opening the Dart VM Service tool window on newer Android Studio builds.
10+
- Replaced the VM tool window's tab strip implementation to avoid `ScrollableContainer` constraint exceptions during focus and measure.
11+
- Stabilized several Dart VM panes so split layouts and scrollable content receive consistent full-size constraints.
12+
13+
### 🔧 Compatibility
14+
- Updated bundled IDE plugin dependencies to `Dart 503.0.0` and `io.flutter 90.0.0`.
15+
616
## 6.9.2 - 2026-02-11
717

818
### ✨ Network Inspector Enhancements

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ dependencies {
7474
intellijIdeaCommunity("2025.2.1")
7575
bundledPlugins(bPlugins)
7676
//"io.flutter:88.2.0"
77-
plugins("Dart:$dartVersion","io.flutter:88.2.0")
77+
plugins("Dart:$dartVersion","io.flutter:90.0.0")
7878
pluginVerifier()
7979
zipSigner()
8080
javaCompiler()

gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
kotlin.stdlib.default.dependency=false
2-
pluginVersion=6.9.2
3-
dartVersion=500.0.0
2+
pluginVersion=6.9.3
3+
dartVersion=503.0.0
44
sinceBuildVersion=252
55
kotlin.daemon.jvmargs=-Xmx5024m
6-
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8
6+
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8
Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package shop.itbug.flutterx.widget
22

3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.horizontalScroll
6+
import androidx.compose.foundation.layout.Arrangement
7+
import androidx.compose.foundation.layout.Row
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.rememberScrollState
10+
import androidx.compose.foundation.shape.RoundedCornerShape
311
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.remember
512
import androidx.compose.ui.Modifier
6-
import org.jetbrains.jewel.foundation.ExperimentalJewelApi
13+
import androidx.compose.ui.draw.clip
14+
import androidx.compose.ui.graphics.Color
15+
import androidx.compose.ui.text.style.TextOverflow
16+
import androidx.compose.ui.unit.dp
717
import org.jetbrains.jewel.foundation.theme.JewelTheme
8-
import org.jetbrains.jewel.ui.component.SimpleTabContent
9-
import org.jetbrains.jewel.ui.component.TabData
10-
import org.jetbrains.jewel.ui.component.TabStrip
18+
import org.jetbrains.jewel.ui.component.Text
1119
import org.jetbrains.jewel.ui.component.styling.TabStyle
1220
import org.jetbrains.jewel.ui.theme.editorTabStyle
21+
import org.jetbrains.jewel.ui.theme.simpleListItemStyle
1322

1423
/**
1524
* 自定义的 TabRow 容器。
@@ -19,27 +28,39 @@ import org.jetbrains.jewel.ui.theme.editorTabStyle
1928
* @param modifier 应用于整个组件的 Modifier。
2029
* @param onTabClick 当一个 Tab 被点击时的回调,返回被点击的 Tab 索引。
2130
*/
22-
@OptIn(ExperimentalJewelApi::class)
2331
@Composable
32+
@Suppress("UNUSED_PARAMETER")
2433
fun CustomTabRow(
2534
selectedTabIndex: Int,
2635
tabs: List<String>,
2736
modifier: Modifier = Modifier,
2837
onTabClick: (Int) -> Unit,
2938
style: TabStyle = JewelTheme.editorTabStyle
3039
) {
31-
val tabs = remember(selectedTabIndex,tabs) {
32-
tabs.mapIndexed { index, string ->
33-
TabData.Default(
34-
selected = index == selectedTabIndex,
35-
content = { SimpleTabContent(string,it) },
36-
closable = false,
37-
onClick = { onTabClick(index) }
40+
Row(
41+
modifier = modifier
42+
.horizontalScroll(rememberScrollState())
43+
.padding(horizontal = 6.dp, vertical = 4.dp),
44+
horizontalArrangement = Arrangement.spacedBy(6.dp)
45+
) {
46+
tabs.forEachIndexed { index, title ->
47+
val selected = index == selectedTabIndex
48+
val backgroundColor =
49+
if (selected) JewelTheme.simpleListItemStyle.colors.backgroundSelectedActive else Color.Transparent
50+
val textColor =
51+
if (selected) JewelTheme.globalColors.text.normal else JewelTheme.globalColors.text.info
52+
53+
Text(
54+
text = title,
55+
color = textColor,
56+
maxLines = 1,
57+
overflow = TextOverflow.Ellipsis,
58+
modifier =
59+
Modifier.clip(RoundedCornerShape(6.dp))
60+
.background(backgroundColor)
61+
.clickable { onTabClick(index) }
62+
.padding(horizontal = 12.dp, vertical = 6.dp)
3863
)
3964
}
4065
}
41-
TabStrip(
42-
tabs, style = style,
43-
modifier = modifier,
44-
)
4566
}

src/main/kotlin/shop/itbug/flutterx/window/vm/DartVmHttpComposeComponent.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private fun AppContentPanel(app: FlutterAppInstance, project: Project) {
8383

8484
HorizontalSplitLayout(
8585
state = outerSplitState,
86-
modifier = Modifier.fillMaxWidth().border(1.dp, color = JewelTheme.globalColors.borders.normal),
86+
modifier = Modifier.fillMaxSize().border(1.dp, color = JewelTheme.globalColors.borders.normal),
8787
first = {
8888
RequestListPanel(
8989
vmService = vmService,
@@ -316,11 +316,16 @@ private fun RequestDetailPanel(
316316

317317

318318
Column(modifier = Modifier.fillMaxSize()) {
319-
CustomTabRow(selectedTabIndex, tabs = tabs.map { it }, onTabClick = {
320-
selectedTabIndex = it
321-
})
319+
CustomTabRow(
320+
selectedTabIndex,
321+
tabs = tabs,
322+
onTabClick = {
323+
selectedTabIndex = it
324+
},
325+
modifier = Modifier.fillMaxWidth().background(JewelTheme.globalColors.panelBackground)
326+
)
322327
Divider(Orientation.Horizontal, Modifier.fillMaxWidth())
323-
Box(modifier = Modifier.weight(1f).padding(8.dp)) {
328+
Box(modifier = Modifier.weight(1f).fillMaxWidth().padding(8.dp)) {
324329
when (selectedTabIndex) {
325330
0 -> OverviewTab(detailedRequest, project)
326331
1 -> HeadersTab(detailedRequest.requestHeaders, detailedRequest.responseHeaders)
@@ -347,7 +352,7 @@ private fun OverviewTab(request: NetworkRequest, project: Project) {
347352
val powerShellText = request.toPowerShellString()
348353
Column(
349354
verticalArrangement = Arrangement.spacedBy(6.dp),
350-
modifier = Modifier.verticalScroll(rememberScrollState())
355+
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
351356
) {
352357
SelectionContainer {
353358
Column(verticalArrangement = Arrangement.spacedBy(6.dp)) {
@@ -841,4 +846,4 @@ private fun String.toHttpUrlOrNull(): SimpleHttpUrl? {
841846
} catch (_: Exception) {
842847
null
843848
}
844-
}
849+
}

src/main/kotlin/shop/itbug/flutterx/window/vm/DartVmStatusComponent.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ private fun FlutterAppStatusPanel(project: Project, app: FlutterAppInstance) {
5252

5353
if (vm != null) {
5454
HorizontalSplitLayout(
55-
modifier = Modifier.fillMaxWidth().border(1.dp, color = JewelTheme.globalColors.borders.normal),
55+
modifier = Modifier.fillMaxSize().border(1.dp, color = JewelTheme.globalColors.borders.normal),
5656
first = {
5757
Column(
58-
modifier = Modifier.padding(12.dp).verticalScroll(rememberScrollState()),
58+
modifier = Modifier.fillMaxSize().padding(12.dp).verticalScroll(rememberScrollState()),
5959
verticalArrangement = Arrangement.spacedBy(6.dp)
6060
) {
6161
VmInfoDisplay(vm!!)
@@ -90,7 +90,7 @@ private fun VmMemoryDisplay(app: FlutterAppInstance, vm: VM, vmService: VmServic
9090
}
9191

9292
Column(
93-
modifier = Modifier.padding(12.dp).verticalScroll(rememberScrollState()),
93+
modifier = Modifier.fillMaxSize().padding(12.dp).verticalScroll(rememberScrollState()),
9494
verticalArrangement = Arrangement.spacedBy(6.dp)
9595
) {
9696
Row(horizontalArrangement = Arrangement.spacedBy(6.dp), verticalAlignment = Alignment.CenterVertically) {
@@ -262,4 +262,4 @@ private fun InspectorStateComponent(vmService: VmService, project: Project) {
262262
) {
263263
Text("Inspector: ${if(isSelect) "On" else "Off"}")
264264
}
265-
}
265+
}

src/main/kotlin/shop/itbug/flutterx/window/vm/FlutterAppsTab.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,20 @@ If you are running on a real device, please make sure the device is connected to
9999
}
100100
} else {
101101
Column(modifier = Modifier.fillMaxSize()) {
102-
CustomTabRow(tabIndex, tabs = flutterAppList.map { it.appInfo.deviceId }.toList(), onTabClick = {
103-
tabIndex = it
104-
})
102+
CustomTabRow(
103+
tabIndex,
104+
tabs = flutterAppList.map { it.appInfo.deviceId },
105+
onTabClick = {
106+
tabIndex = it
107+
},
108+
modifier = Modifier.fillMaxWidth().background(JewelTheme.globalColors.panelBackground)
109+
)
105110
val selectApp = flutterAppList.getOrNull(tabIndex)
106111
if (selectApp != null) {
107-
body.invoke(selectApp)
112+
Box(modifier = Modifier.weight(1f).fillMaxWidth()) {
113+
body.invoke(selectApp)
114+
}
108115
}
109116
}
110117
}
111118
}
112-

src/main/kotlin/shop/itbug/flutterx/window/vm/ProviderComposeComponent.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private fun ProviderList(state: ProviderState) {
9595
val bgColor = if (JewelTheme.isDark) Color.DarkGray else Color.White
9696

9797
Column(
98-
modifier = Modifier.padding(12.dp).verticalScroll(rememberScrollState()),
98+
modifier = Modifier.fillMaxSize().padding(12.dp).verticalScroll(rememberScrollState()),
9999
verticalArrangement = Arrangement.spacedBy(6.dp)
100100
) {
101101
Row(horizontalArrangement = Arrangement.spacedBy(6.dp), verticalAlignment = Alignment.CenterVertically) {
@@ -138,7 +138,7 @@ private fun ProviderList(state: ProviderState) {
138138
private fun ProviderDetails(vmService: VmService, provider: ProviderNode) {
139139
println("provider详情:$provider")
140140
val rootPath = remember(provider, provider.id) { provider.getProviderPath() }
141-
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(8.dp)) {
141+
Column(modifier = Modifier.fillMaxSize().padding(8.dp).verticalScroll(rememberScrollState())) {
142142
InstanceNodeViewer(vmService = vmService, path = rootPath)
143143
}
144144
}

0 commit comments

Comments
 (0)