Флаттер: Могу ли я использовать чернила в недопустимом?

#flutter #dismissible #rust-ink

Вопрос:

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

После того, как я завернул его в Dismissible, я получил странный эффект: когда я провожу пальцем по виджету, его содержимое перемещается, как и ожидалось, но украшение застревает в исходном положении.

Вы можете увидеть это вживую в dartpad: https://dartpad.dev/5ef2d2eb3823821a74aa11c680d84d4b?null_safety=true

Вопрос: Это предполагаемое поведение в flutter или это ошибка?

Примечание: Проблема исчезает, если я заменяю чернила контейнером или удаляю их из SingleChildScrollView.

Код для воспроизведения:

 
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        // remove SingleChildScrollView and all will be fine
        body: SingleChildScrollView(
          child: Dismissible(
            key: Key('1'),
            // change Ink to Container and all will be fine
            child: Ink(
              width: 100,
              height: 100,
              color: Colors.red,
              child: Text('Swipe me, and watch my background get stuck!'),
            ),
          ),
        ),
      ),
    );
  }
}
 

Ответ №1:

Документация Ink ис…

Рисует украшение (которое может быть простым цветом) на [материале].

Это происходит в вашем примере кода, потому что он окрашивает MaterialApp . Чтобы устранить вашу проблему, оберните Ink внутреннюю часть a Material .

Образец…

 Material(
  child: Ink(
    width: 100,
    height: 100,
    color: Colors.red,
    child: Text('Swipe me, and watch my background get stuck!'),
  ),
),